【问题标题】:Build an Array Pyramid/Cone构建一个阵列金字塔/锥体
【发布时间】:2020-06-09 08:18:54
【问题描述】:

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

我的函数有以下原型:

    float getPyramidHeight(int x, int y)
    {

    }

    float getConeHeight(int x, int y)
    {

    }

基本上,我有 2 个变量:

w = 二维数组长度

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】:

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

    如果LENGTH 不等于WIDTH,则旋转对称性消失。圆已经变成了椭圆。每一层都以椭圆而不是圆形的形式投影到底部。做的最简单的事情是想象你的圆锥体是由具有单位半径的圆锥体的各向异性拉伸制成的,然后将你的点转换成它。然后就可以使用上面的了。 (事实上​​,仅缩放一个轴就足够了)。剩下的就交给你了。

    鉴于您的 2D 网格是离散的,您应该确保所有计算都使用正确的类型完成,并且您不使用整数除法而不是浮点除法。

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

    • 你真的需要你已经包含的两个标题吗?

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

    • 不要以这种方式使用#defines。 constexpr size_tconstexpr int 可能更合适。

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

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

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

    【讨论】:

    • 嘿Lukas,在多次阅读你的解释后,我明白垂直高度与中心的距离成正比,所以,基本上我将中心的距离映射到高度,我已经设法建造了金字塔。我已经在一行中解决了这个问题!令人难以置信,当您改变看待这个问题的角度时,这是多么容易。关于全局变量和定义,我将按照你上面所说的那样做,因为我一直像我的例子那样做,但我知道这是不对的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    相关资源
    最近更新 更多