练习 13,来自 Stroustrup 的编程原则和使用 c++ 的练习的第 12 章。
超椭圆是由方程定义的二维形状
在网上查找 超椭圆,以更好地了解此类形状的外观。编写一个程序,通过连接超椭圆上的点来绘制“星状”图案。将 a、b、m、n 和 N 作为参数。在由 a、b、m 和 n 定义的超椭圆上选择 N 个点。为“相等”的某些定义使点等距将这些 N 点中的每一个连接到一个或多个其他点(如果您愿意,可以将点数连接到另一个参数,或者只使用 N-1,即所有我角点)。
我有一个向量,其中包含我可以构建超椭圆的点 我无法得到练习的第二部分 - 如何找到位于超椭圆上的 N 点来构建星星?
谢谢
//------------------------------------------------------------------------------
struct Point {
int x, y;
Point(int xx, int yy) : x(xx), y(yy) { }
Point() :x(0), y(0) { }
};
//------------------------------------------------------------------------------
int sgn(double d) {
if (d < 0)
return -1;
if (d == 0)
return 0;
if (d > 0)
return 1;
// exception
error("sgn: something gone wrong\n");
}
//------------------------------------------------------------------------------
vector<Point> superellipse(double a, double b, double m, double n, double precision = 0.01, int xCenter = 200, int yCenter = 200) {
if (precision >= 1.00 || precision < 0.001)
error ("use numbers from range [0.001 ; 1.00) for precision parametr\n");
vector<Point> points;
Point temp;
Point P;
for (double d = -1.0; d < 1.00; d += precision) {
double t = d*M_PI;
int x = pow((abs(cos(t))),2.0/m) * a * sgn(cos(t));
int y = pow((abs(sin(t))),2.0/n) * b * sgn(sin(t));
P = Point(x + xCenter, y + yCenter);
if (P != temp) // ignore dublicates
points.push_back(P);
temp = P;
}
return points;
}
//------------------------------------------------------------------------------