构建数组 Pyramid/Cone
Build an Array Pyramid/Cone
我正在做一个项目,需要用适当的值填充二维数组的单元格,以便构建两个形状,一个金字塔和一个圆锥体。我将非常感谢任何有关实施此算法的帮助。基本上,我需要传递二维数组的 x 和 y 坐标,函数应该 return 这些坐标处的正确高度值。最小高度为 0,最大高度为 100。
我的函数有以下原型:
float getPyramidHeight(int x, int y)
{
}
float getConeHeight(int x, int y)
{
}
基本上,我有 2 个变量:
w = 2D Array Length
和
h = 2D Array Width
这是我现在所在的位置:
#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;
}
我知道它还不完整,但这是我所能做到的。感谢您的宝贵时间!
这更多的是关于几何而不是编程。首先考虑锥体和LENGTH=WIDTH
。由于对称性,给定点上方的高度仅取决于它与底座中心的距离。如何?通过顶点绘制圆锥体的垂直横截面,并尝试找到两者之间的关系。寻找相似的三角形。
如果LENGTH
不等于WIDTH
,旋转对称性就消失了。圆圈变成了椭圆形。每一层都以椭圆而不是圆形的形式投射到底座中。最简单的做法是想象您的圆锥体是通过从具有单位半径的圆锥体进行各向异性拉伸而制成的,并将您的点转换为圆锥体。然后就可以使用上面的了。 (事实上,只缩放一个轴就足够了)。剩下的就交给你了。
鉴于您的 2D 网格是离散的,您应该确保所有计算都是使用正确的类型完成的,并且您不要使用整数除法而不是 floating-point 除法。
关于代码,我有以下建议:
你真的需要你所包含的两个 headers 吗?
using namespace std
在文件范围内一般是 not recommended.
不要这样使用 #define
。 constexpr size_t
或 constexpr int
可能更合适。
通常不鼓励使用全局变量,尽管在像这样的简单任务中使用它们可能比传递东西更简单(如果您可以确定项目不会增长并且不会多线程)。
如果您决定摆脱全局(但即使您不这样做),使用 std::array
而不是 C 数组将使传递和返回结构更容易。使用 std::vector
甚至可以在运行时配置边界。
前向声明很好,但在这种情况下它们只是不必要的样板文件。我会考虑重新排序函数。
我正在做一个项目,需要用适当的值填充二维数组的单元格,以便构建两个形状,一个金字塔和一个圆锥体。我将非常感谢任何有关实施此算法的帮助。基本上,我需要传递二维数组的 x 和 y 坐标,函数应该 return 这些坐标处的正确高度值。最小高度为 0,最大高度为 100。
我的函数有以下原型:
float getPyramidHeight(int x, int y)
{
}
float getConeHeight(int x, int y)
{
}
基本上,我有 2 个变量:
w = 2D Array Length
和
h = 2D Array Width
这是我现在所在的位置:
#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;
}
我知道它还不完整,但这是我所能做到的。感谢您的宝贵时间!
这更多的是关于几何而不是编程。首先考虑锥体和LENGTH=WIDTH
。由于对称性,给定点上方的高度仅取决于它与底座中心的距离。如何?通过顶点绘制圆锥体的垂直横截面,并尝试找到两者之间的关系。寻找相似的三角形。
如果LENGTH
不等于WIDTH
,旋转对称性就消失了。圆圈变成了椭圆形。每一层都以椭圆而不是圆形的形式投射到底座中。最简单的做法是想象您的圆锥体是通过从具有单位半径的圆锥体进行各向异性拉伸而制成的,并将您的点转换为圆锥体。然后就可以使用上面的了。 (事实上,只缩放一个轴就足够了)。剩下的就交给你了。
鉴于您的 2D 网格是离散的,您应该确保所有计算都是使用正确的类型完成的,并且您不要使用整数除法而不是 floating-point 除法。
关于代码,我有以下建议:
你真的需要你所包含的两个 headers 吗?
using namespace std
在文件范围内一般是 not recommended.不要这样使用
#define
。constexpr size_t
或constexpr int
可能更合适。通常不鼓励使用全局变量,尽管在像这样的简单任务中使用它们可能比传递东西更简单(如果您可以确定项目不会增长并且不会多线程)。
如果您决定摆脱全局(但即使您不这样做),使用
std::array
而不是 C 数组将使传递和返回结构更容易。使用std::vector
甚至可以在运行时配置边界。前向声明很好,但在这种情况下它们只是不必要的样板文件。我会考虑重新排序函数。