Stroustrup の「プログラミングの原則と c++ を使用した実践」の第 12 章の演習 13。
超楕円は、次の式で定義される 2 次元形状です。
Web で超楕円を検索して、そのような形状がどのように見えるかをよりよく理解してください。 超楕円上の点を結んで「星のような」パターンを描くプログラムを書きなさい。a、b、m、n、および N を引数として取ります。a、b、m、および n で定義される超楕円上の N 点を選択します。「等しい」という定義のために、点を等間隔にします。これらの N 個の点のそれぞれを 1 つ以上の他の点に接続します (必要に応じて、点の数を別の引数に接続するか、単に N-1 を使用できます。つまり、すべての私オーナポイント)。
超楕円を構築できる点を含むベクトルがあります。演習の 2 番目の部分を取得できません - 超楕円上にある 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;
}
//------------------------------------------------------------------------------