2016-04-01 29 views
2

Konsol ekranında rasgele eşkenar üçgenler oluşturmaya çalışıyorum.Bazen eşkenar ve bazen olmayan üçgenler?

Kullandığım yöntem üçgenin (rastgele konumlandırılmış) orta noktasını oluşturmak, orta noktayı başlangıç ​​noktasına (0,0) taşımak ve ardından merkezden 3 nokta oluşturmak (yarıçapı (rasgele sayı) eklemek) oluşturmaktır. Üçgenin her bir noktanın Y eksenine göre). Sonra biri 120 derece, diğeri 240'da bir eşkenar üçgen yaparak 2 noktayı döndürürüm, sonra noktalar arasında çizgiler çizerim. Daha sonra noktaları centroid ile ilgili orijinal arsaya geri getirin.

Bu, zamanın en eskisi için çalışır ve bir eşkenar üçgene sahip olurum, ancak diğer zamanlarda tam olarak bir eşkenar üçgen elde edemiyorum ve neden tam bir zarara uğruyorum.

Brensenham'ın çizgi algoritmasını kullanarak noktalar arasındaki çizgiyi çiziyorum. çalışma üçgenin

Resim: Kırık üçgenin http://imgur.com/GpF406O

Resmi: İki görüntüleri baktığımızda

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

İki üçgeninizin resimlerine bakmak, üçgenlerin (metin karakterleriyle temsil edilen) piksellerle çizilmesi gibi görünebilir; bu da, her bir köşe noktasını (ya bu piksel sırası ya da bir sonraki satır) çizmek için kesin olarak izin verilen konumların olmasını sağlar.) Benim tahminim, çizgilerin çizilmesi için kullandığınız algoritmanın bir çeşit arama yapması (bu satırı a veya satır b olarak çizmesi) ve her iki köşe için de aynı satırın seçilmemesidir. Uygulamada daha fazla ayrıntı olmadan Çizgi çizme algoritması için kullanmak, bir şekilde ya da ötekini söylemek zor olurdu. – Tuffwer

+0

Hesaplanması gereken yükseklik değeri, iki satır ve kayan nokta hatası arasındaki sınırın yüksekliğinin üzerinde (veya çok yakın) açık olması durumunda, eğriyi yazdırmak için satırın seçimindeki farklılık olabilir. hemen aşağıda. Çoğu zaman yazılımda bu bir kat olduğunda, aşağıdan bir sonraki satırda sona erecek şekilde bir zemin denir. – Tuffwer

cevap

1

: Burada http://imgur.com/Oa2BYun

üçgenin için Coords çizer koddur üçgenler (ve çizgi çizme algoritmasına bakarak) çizgileri bir dizi ayrı piksel olarak çiziyorsunuz. Bu, image numaralı belgede olduğu gibi bir tepe noktasının bir piksele (sınırda olamaz) düşmesi gerektiği anlamına gelir.

Eğer vertex'iniz pikseller arasında bir sınırda düşerse ne olur? Satır çizim algoritması

bir www.cs.helsinki.fi gördüğüm bir sayfada wikipedia üzerinde algoritma tanımı ve C++ uygulaması bakarak. Içinde köşe koymak için hangi piksel üzerinde bir karar olduğunu tamsayı aritmetik kullanarak hem liste uygulamaları ** Bu durumda makul olmayan pikseller varsa, bu durumda mantıksız değildir. Bu, kayan nokta hesaplamalarının katın (floattan int'ye dönüştürme) yapıldığı sırada bir sonraki piksel sırası için bir tamsayı etiketinin eşiğinin üstüne bir köşe noktası koyması, ancak diğer köşe noktasının bu eşiğin altında olması durumunda, iki noktanın farklı satırlara yerleştirilebilir. Eğer tek sorun zaman zaman meydana gelen bakınız neden

v1.y = 5.00000000000000000001 ve sıranın 5 konuyor ve satırda konuyor v2 v1 yol açar v2.y = 4.99999999999999999999 düşünüyorum 4.

Bu, yalnızca zaman zaman köşe bir sınır iniş var açıklıyor bunun gibi. Bir kaç şey düzeltmek için

akla gelen:

Fix it size köşeler değerler atar, y değerleri her durumda aynıdır.

verilen: Kendi Brensenham algoritması uygulaması size bir onay ekleyebilirsiniz yazdı

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) 

Bu

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

ergo için iki y değerlerini azaltır Köşelerinizin aynı yükseklikte olduğundan emin olmak için bu kod, ama gerçekten kötü bir playa benziyor Son noktaların yüksekliği probleminize özel olduğundan ve genel olarak çizgilerin çizilmediğinden, bu tür bir kontrolü yapmak için ce.


* Ya tam olarak, ama sen noktası hatası kayan hesaplandıktan sonra farkı söyleyemem yeterince yakın

** algoritma aritmetik tamsayı kısıtlı ama düzensizlik verili şüpheli değil Probleminiz ve algoritmanın nasıl sunulduğunun yanı sıra, resimlerinizdeki satırlar için gizli karakterler kullandığınız gerçeği ile tamsayı aritmetiği sorun olur.