2016-04-01 8 views
2

コンソール画面に正三角形をランダムに生成しようとしています。時には正三角形で時には正三角形ではありませんか?

三角形の中心点をランダムに配置し、中心点を原点(0,0)に移動して中心から3点を作成する方法です(半径(乱数)を追加する)三角形の各点のY軸への距離)。次に、2つの点を120度に回転させ、もう1つを240で回転させて、正三角形を作り、点の間に線を描きます。その後、重心に関連する元のプロットにポイントを戻します。

これは時間の仕事のほとんどの過去と私は正三角形を得るが、私はかなり正三角形を取得しないと私はなぜ完全な損失になっています。

私はポイント間の線を描画するためにBrensenhamの線アルゴリズムを使用しています。作業三角形の

画像:壊れた三角形のhttp://imgur.com/GpF406O

画像:あなたの2の画像を見ると

void Triangle::createVertex(Vertex cent) 
{ 
// angle of 120 in radians 
double s120 = sin(2.0943951024); 
double c120 = cos(2.0943951024); 
// angle of 240 in radians 
double s240 = sin(4.1887902048); 
double c240 = cos(4.1887902048); 

// bringing centroid to the origin and saving old pos to move later on 
int x = cent.getX(); 
int y = cent.getY(); 
cent.setX(0); 
cent.setY(0); 

// creating the points all equal distance from the centroid 
Vertex v1(cent.getX(), cent.getY() + radius); 
Vertex v2(cent.getX(), cent.getY() + radius); 
Vertex v3(cent.getX(), cent.getY() + radius); 

// rotate points 
double newx = v1.getX() * c120 - v1.getY() * s120; 
double newy = v1.getY() * c120 + v1.getX() * s120; 

double xnew = v2.getX() * c240 - v2.getY() * s240; 
double ynew = v2.getY() * c240 + v2.getX() * s240; 

// giving the points the actual location in relation the the old pos of the centroid 
v1.setX(newx + x); 
v1.setY(newy + y); 

v2.setX(xnew + x); 
v2.setY(ynew + y); 

v3.setX(x); 
v3.setY(y + radius); 

// adding the to a list (list is used in a function to draw the lines) 
vertices.push_back(v1); 
vertices.push_back(v2); 
vertices.push_back(v3); 
} 
+0

2つの三角形の画像を見ると、ピクセル(テキスト文字で表される)で三角形を描いているように見えます。これにより、慎重な許容位置が各頂点(このピクセルの行または次のピクセルのいずれか) )私の推測では、線を描画するためのアルゴリズムは何らかの呼び出し(行aまたは行bでこのピクセルを描画)しなければならず、同じ行が両方の頂点に対して選択されていません。ライン描画アルゴリズムのために、一方通行か他方通行かを言うのは難しいでしょう。 – Tuffwer

+0

頂点を印刷する行の選択の不一致は、計算する必要がある高さの値が2つの行の境界の高さにある(または非常に近い)場合に発生し、浮動小数点エラーは真ちょうど下に。ほとんどの場合、ソフトウェアでそれが起きたときにフロアが呼び出されるので、すぐ下にあるものが次の行で終了します。 – Tuffwer

答えて

1

:ここhttp://imgur.com/Oa2BYun

は、三角形のためのCOORDSをプロットしたコードです三角形(線描画アルゴリズムを見てみると)は、線を一連の離散ピクセルとして描画しています。つまり、このimageのように、頂点がピクセル内に入る必要があります(境界上にあることはできません)。

頂点がピクセル間の境界にある場合はどうなりますか?あなたの線画アルゴリズムが

www.cs.helsinki.fi は、私が見るページの wikipediaのアルゴリズム記述およびC++の実装を見てみると。で頂点を置くためにどの画素に決定を下す必要があることを整数演算を使用して、両方のリストの実装**この場合、ピクセルの控えめな行を持っていれば、不合理ではありません。つまり、フロート(floatからintへの変換)が完了したにもかかわらず、他の頂点がそのしきい値を下回っているときに、浮動小数点計算によって1つの頂点をピクセルの次の行の整数ラベルのしきい値より上に置くと、2つの頂点は異なる行に置くことができます。

はV1につながるv1.y = 5.00000000000000000001v2.y = 4.99999999999999999999は4

を行5の上に置かれているとv2がローの上に置かれている。これは、あなたが唯一の問題は時折発生してご覧なぜ、あなたはたまにしか境界上の頂点の土地を持って説明して考えますこのような。物事のカップルを固定するために

が頭に浮かぶ:あなたの頂点に値を割り当てるとき

は、それを修正し、yの値はとにかく同じです。

与えられた:あなたがあなた自身のBrensenhamのアルゴリズムの実装を書いた場合

v1.setY(newy + y); 
v2.setY(newy + y); 

あなたがチェックを追加することができます。

v1.getX() = v2.getX() = 0 (defined by your code) 
v1.getY() = v2.getY() = radius (defined by your code) 
cos(120 degrees) = cos(240 degrees) ('tis true) 

これは

double newy = v1.getY() * c120 
double ynew = v1.getY() * c120 

エルゴにあなたの2つのYの値が減少しあなたの頂点が同じ高さにあることを確認するためのコードですが、それは本当に悪いplaのようですエンドポイントの高さは問題に固有のものであり、一般的な線を描くものではないので、この種のチェックを行うことができます。


*かどうかを正確に、しかし、あなたは浮動小数点エラー

を考慮した後の違いを見分けることはできません十分に近い**アルゴリズムは算術演算を整数に制限されたが、私はの凹凸与え疑われていませんあなたの問題とアルゴリズムが提示された方法と、あなたの画像のラインに控えめな文字を使っていて、整数の算術が問題であるという事実があります。