建立阵列金字塔/圆锥体

问题描述 投票:0回答:1

我正在一个项目中,该项目需要用适当的值填充2D数组的单元以构建两个形状,即金字塔和圆锥。我将非常感谢您对实现此算法的任何帮助。基本上,我需要传递2D数组的x和y坐标,并且该函数应在这些坐标处返回正确的高度值。最小高度为0,最大高度为100。enter image description hereenter image description here

我的函数具有以下原型:

    float getPyramidHeight(int x, int y)
    {

    }

    float getConeHeight(int x, int y)
    {

    }

基本上,我有2个变量:

w = 2D数组长度

h = 2D阵列宽度

这是我现在的位置:

#include <iostream>
#include <stdio.h>
using namespace std;

#define LENGTH 1000
#define WIDTH 800

float pyramidHeights[LENGTH][WIDTH]={0};
float coneHeights[LENGTH][WIDTH]={0};

float getPyramidHeight(int x, int y);
float getConeHeight(int x, int y);
void fillPyramid(int x, int y);
void fillCone(int x, int y);

int main()
{
    fillPyramid(LENGTH, WIDTH);
    fillCone(LENGTH, WIDTH);
    return 0;
}

void fillPyramid(int x, int y)
{
  for(int i=0;i<x;i++)
  {
     for(int j=0;j<y;j++)
     {
        pyramidHeights[i][j]=getPyramidHeight(i,j);
     }
  }
}

void fillCone(int x, int y)
{
  for(int i=0;i<x;i++)
  {
     for(int j=0;j<y;j++)
     {
        coneHeights[i][j]=getConeHeight(i,j);
     }
  }
}

float getPyramidHeight(int x, int y)
{
    //This is the first function I need to implement.

   return 0;
}

float getConeHeight(int x, int y)
{
    //This is the second function I need to implement.

   return 0;
}

我知道它还不完整,但这是我所能做到的。谢谢您的时间!

c++ arrays 2d
1个回答
0
投票

这更多是关于几何而不是编程。首先考虑圆锥和LENGTH=WIDTH。由于对称性,给定点上方的高度仅取决于其距基座中心的距离。怎么样?通过顶点绘制圆锥的垂直横截面,并尝试找到两者之间的关系。寻找相似的三角形。

LENGTH不等于WIDTH时,旋转对称消失。圆已变成椭圆形。每个图层都以椭圆而不是圆形的形式伸入基础。最简单的操作是想象您的圆锥体是通过从具有单位半径的圆锥体中各向异性拉伸而制成的,并将其点不变形。然后,您可以使用以上内容。 (实际上,仅缩放一个轴就足够了)。我把剩下的交给你。

鉴于您的2D网格是离散的,应确保所有计算均使用正确的类型进行,并且例如不要进行整数除法而不是浮点除法。

关于代码,我有以下建议:

  • 您真的需要同时包含两个标头吗?

  • [using namespace std在文件范围内通常是not recommended

  • 请勿使用#defineconstexpr size_tconstexpr int可能更合适。

  • 通常不鼓励使用全局变量,尽管在这样的简单任务中,使用它们比传递东西要容易得多(如果可以确定项目不会增长并且不会成为多线程的话。)

  • 如果您决定摆脱全局变量(但即使您不这样做),则使用std::array代替C数组将使传递和返回结构更加容易。使用std::vector甚至可以在运行时配置范围。

  • 前向声明很好,但是在这种情况下,它们只是不必要的样板。我会考虑将功能重新排序。

© www.soinside.com 2019 - 2024. All rights reserved.