Tässähän tuo olisi kaamealla purkalla väännettynä, kiva oisi tuollainen yleistää millä tahansa n-kulmiolle, mutta luultavasti siinä tulee ongelmaksi ettei tiedä miten ne monikulmiot kolmioista rakentaisi. Onkos vinkkejä?
Code: Select all
t1x = Rand(0,400)
t1y = Rand(0,300)
t2x = Rand(0,400)
t2y = Rand(0,300)
t3x = Rand(0,400)
t3y = Rand(0,300)
t1 = Rand(10,100)
t2 = Rand(10,100)
t3 = Rand(10,100)
Repeat
triangle(t1x,t1y,t2x,t2y,t3x,t3y)
If KeyHit(cbkeyspace) Then
t1x = Rand(0,400)
t1y = Rand(0,300)
t2x = Rand(0,400)
t2y = Rand(0,300)
t3x = Rand(0,400)
t3y = Rand(0,300)
t1 = Rand(10,100)
t2 = Rand(10,100)
t3 = Rand(10,100)
EndIf
tx1=MouseX()+Cos(ang)*t1
ty1=MouseY()+Sin(ang)*t1
tx2=MouseX()+Cos(ang+120)*t2
ty2=MouseY()+Sin(ang+120)*t2
tx3=MouseX()+Cos(ang+240)*t3
ty3=MouseY()+Sin(ang+240)*t3
triangle(tx1,ty1,tx2,ty2,tx3,ty3)
If TriangleOverlap(t1x,t1y,t2x,t2y,t3x,t3y,tx1,ty1,tx2,ty2,tx3,ty3) Then
Color cbred
Else
Color cbwhite
EndIf
DrawScreen
Forever
Function Triangle(x1,y1,x2,y2,x3,y3,fill=0) 'by atomimalli
Line x1,y1,x2,y2
Line x2,y2,x3,y3
Line x3,y3,x1,y1
If fill = True Then
If y2<y1 Then 'jos p2 on ylempänä kuin p1 vaihdetaan niiden paikkaa
tmp=y1
y1=y2
y2=tmp
tmp=x1
x1=x2
x2=tmp
EndIf
If y3<y1 Then 'jos p3 on ylempänä kuin p1 vaihdetaan niiden paikkaa
tmp=y1
y1=y3
y3=tmp
tmp=x1
x1=x3
x3=tmp
EndIf
If y3<y2 Then 'jos p3 on ylempänä kuin p2 vaihdetaan niiden paikkaa
tmp=y2
y2=y3
y3=tmp
tmp=x2
x2=x3
x3=tmp
EndIf
'pisteet ovat nyt järjestyksessä
'ylhäältä alas p1(x1,y1), p2(x2,y2), p3(x3,y3)
dy1=y2-y1'pystysuora matka p1:sta p2:seen
dx1=x2-x1'vaakasuora matka p1:sta p2:seen
dy2=y3-y1'pystysuora matka p1:sta p3:meen
dx2=x3-x1'vaakasuora matka p1:sta p3:meen
If dy1 Then 'jos kolmion yläosa on pidempi kuin 0
'käydään läpi kaikki vaakaviivat kolmion yläosassa(p1-p2)
For i = y1 To y2
'lasketaan seuraava x-koordinaatti p1:stä p2:seen
ax=x1+((i-y1)*dx1)/dy1
'lasketaan seuraava x-koordinaatti p1:stä p3:meen
bx=x1+((i-y1)*dx2)/dy2
Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
Next i
EndIf
dy1=y3-y2'pystysuora matka p2:sta p3:meen
dx1=x3-x2'vaakasuora matka p2:sta p3:meen
If dy1 Then 'jos kolmion alaosa on pidempi kuin 0
'käydään läpi kaikki vaakaviivat kolmion alaosassa(p2-p3)
For i = y2 To y3
'lasketaan seuraava x-koordinaatti p2:stä p3:meen
ax=x2+((i-y2)*dx1)/dy1
'lasketaan seuraava x-koordinaatti p1:stä p3:meen
bx=x1+((i-y1)*dx2)/dy2
Line ax,i,bx,i 'piirretään viiva kolmion reunojen välille
Next i
EndIf
EndIf
EndFunction
Function TriangleOverlap(x1#,y1#,x2#,y2#,x3#,y3#,xx1#,yy1#,xx2#,yy2#,xx3#,yy3#)
If PointInTriangle(xx1#, yy1#, x1#, y1#, x2#, y2#, x3#, y3#) Then Return True
If PointInTriangle(xx2#, yy2#, x1#, y1#, x2#, y2#, x3#, y3#) Then Return True
If PointInTriangle(xx3#, yy3#, x1#, y1#, x2#, y2#, x3#, y3#) Then Return True
If Lines_Intersect(x1#,y1#,x2#,y2#, xx1#,yy1#,xx2#,yy2#) Then Return True
If Lines_Intersect(x2#,y2#,x3#,y3#, xx1#,yy1#,xx2#,yy2#) Then Return True
If Lines_Intersect(x1#,y1#,x3#,y3#, xx1#,yy1#,xx2#,yy2#) Then Return True
If Lines_Intersect(x1#,y1#,x2#,y2#, xx1#,yy1#,xx3#,yy3#) Then Return True
If Lines_Intersect(x1#,y1#,x3#,y3#, xx1#,yy1#,xx3#,yy3#) Then Return True
If Lines_Intersect(x3#,y3#,x2#,y2#, xx1#,yy1#,xx3#,yy3#) Then Return True
If Lines_Intersect(x1#,y1#,x2#,y2#, xx2#,yy2#,xx3#,yy3#) Then Return True
If Lines_Intersect(x3#,y3#,x2#,y2#, xx2#,yy2#,xx3#,yy3#) Then Return True
If Lines_Intersect(x1#,y1#,x3#,y3#, xx2#,yy2#,xx3#,yy3#) Then Return True
Return False
End Function
Function PointInTriangle(x#, y#, x1#, y1#, x2#, y2#, x3#, y3#)
ab# = ((y - y1) * (x2 - x1) - (x - x1) * (y2 - y1)) / 1000.0
bc# = ((y - y2) * (x3 - x2) - (x - x2) * (y3 - y2)) / 1000.0
ca# = ((y - y3) * (x1 - x3) - (x - x3) * (y1 - y3)) / 1000.0
If (ab * bc) > 0 And (bc * ca) > 0 Then Return True
Return False
EndFunction
Function Lines_Intersect(Ax#, Ay#, Bx#, By#, Cx#, Cy#, Dx#, Dy#)
Rn# = (Ay#-Cy#)*(Dx#-Cx#) - (Ax#-Cx#)*(Dy#-Cy#)
Rd# = (Bx#-Ax#)*(Dy#-Cy#) - (By#-Ay#)*(Dx#-Cx#)
If Rd# = 0
Return False
Else
Sn# = (Ay#-Cy#)*(Bx#-Ax#) - (Ax#-Cx#)*(By#-Ay#)
Intersection_AB# = Rn# / Rd#
Intersection_CD# = Sn# / Rd#
If Intersection_AB#>1 Or Intersection_CD#>1 Or Intersection_AB#<0 Or Intersection_CD#<0 Then Return False
IntersX = Ax# + Intersection_AB#*(Bx#-Ax#)
IntersY = Ay# + Intersection_AB#*(By#-Ay#)
Return True
EndIf
End Function