linie verlängern
Übersicht

DarrenBetreff: linie verlängern |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hi com!
ich bin grade dabei ein programm zu schreiben, bei dem es um dreiecke geht. also ich setze drei punkte, dann wird ein dreieck gezeichnet und der ganze Rest wird generiert(winkel, seitenlängen, ankreise, seitenhalbierende usw) so jezt würde ich gerne eine Gerade verlängern. ich habe also 2 punkte und leg da ne linie dazwischen. das ist ja noch einfach. will ich aber, dass sich die linie um eine bestimmte anzahl von pixeln verlängert, scheitere ich und ich weiß nich wo mein denkfehler liegen soll. vlt kann mal einer den code testen. einfach 2mal ins fenster klicken, damit 2 punkte enttstehen. und mir vlt sagen, was ich falsch mache ![]() Code: [AUSKLAPPEN] Graphics 800,600,16,2 SetBuffer BackBuffer() Global maus_x,maus_y Dim punkt_x#(1) Dim punkt_y#(2) Global steigung# Global a#,b# Global index = 0 While Not KeyHit(1) maus_x=MouseX() maus_y=MouseY() Text 10,10, steigung If MouseHit(1) And index <= 1 Then punkt_x(index) = maus_x punkt_y(index) = maus_y index = index + 1 If index = 2 Then steigung = ATan((punkt_x(1)-punkt_x(0))/(punkt_y(1)-punkt_y(0))) End If End If If index = 2 Then ;punkte verbinden Line punkt_x(0),punkt_y(0),punkt_x(1),punkt_y(1) b = Cos(steigung) *100 a = Sin(steigung) *100 Line punkt_x(0),punkt_y(0),punkt_x(0)+b,punkt_y(0)+a End If Flip Cls Wend End |
||
MFG Darren |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Willst du eine Verhältnisangabe zB doppelt so lang wie bisher usw... dann mach es aus dem Verhältnis X-Abstand und Y-Abstand und multipliziere diese beiden Werte mit deinem Multiplikator.
Willst du aber eine Absolutangabe angeben, so mach es mithilfe von ql:Atan2, ql:Sin und ql:Cos... Atan2 ist gerade für sowas gemacht. Wird das ganz später in 3D umgesetzt, so würde ich es gleich mit ql:TFormVector und co. machen. Gerade die letzte Möglichkeit ist besonders einfach, und es gibt sogar schon ql:TFormNormal, wo du schon eine Normalisierte Länge als Ergebnis raus bekommst. edit1: Code: [AUSKLAPPEN] Graphics 800,600,0,2
SetBuffer BackBuffer() lm#=1 ;Längenmultiplikator, 1=einmal länger usw. al#=50 ;Absolutverlängerung xp1=200 yp1=200 xp2=400 yp2=200 While Not KeyHit(1) mx=MouseX() my=MouseY() If MouseHit(1) xp1=mx yp1=my End If If MouseHit(2) xp2=mx yp2=my End If Color 0,255,0 Line xp1,yp1,mx+(mx-xp1)*lm,my+(my-yp1)*lm Color 255,0,0 wk#=ATan2(my-yp2,mx-xp2) xadd=Cos(wk)*al yadd=Sin(wk)*al Line xp2,yp2,mx+xadd,my+yadd Flip Cls Wend End |
||
Darren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja mann! danke so geht's
lag vlt daran, dass Tangens nicht bis 360° arbeitet. Kann einer erklären, warum bei atan2 x und y vertauscht sind? |
||
MFG Darren |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Weil arkus tangens y / x annimmt, arithmetisch gesehen ist da Y der erste Parameter und X der zweite. Vermute das war da die Überlegung. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weil hier Y=0 oben ist und Y>0 nach unten, was wohl nicht mit dem übereinstimmt was man so in der Schule gelernt hat, wo die kleinere Y-Werte weiter unten sind.
edit1: Huch Dreamora, kann natürlich auch sein. Bei meiner Draw3D, wo die Y-Werte nach oben größer werden, muß ich wieder Atan2(x,y) machen. Deshalb bin ich davon ausgegangen. Komische Sache... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ausser Mark wird das wohl niemand mit Sicherheit wissen. Potentiell Möglich wäre deines natürlich auch ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
Falls es noch wen interessiert, so würde ich Linien verlängern:
Code: [AUSKLAPPEN] Graphics 800, 600, 0, 2
SetBuffer BackBuffer() ;Zwei Punkte px1 = 200 py1 = 250 px2 = 640 py2 = 400 ;Überhang u = 20 Repeat u = u + MouseZSpeed() mx = (px1 + px2) / 2 my = (py1 + py2) / 2 dist = Sqr((px1 - px2)^2 + (py1 - py2)^2) zx1 = mx - Sin(Winkel(mx, my, px1, py1)) * (dist / 2 + u) zy1 = my - Cos(Winkel(mx, my, px1, py1)) * (dist / 2 + u) zx2 = mx - Sin(Winkel(mx, my, px2, py2)) * (dist / 2 + u) zy2 = my - Cos(Winkel(mx, my, px2, py2)) * (dist / 2 + u) Cls Text 0, 0, "Überhang (Ändern mit Mausrad): " + u Oval px1 - 2, py1 - 2, 4, 4 Oval px2 - 2, py2 - 2, 4, 4 Line zx1, zy1, zx2, zy2 ;Geradenabschnitt zeichnen Flip() Until KeyDown(1) WaitKey() End Function Winkel#(x1#,y1#,x2#,y2#) Return (360+ATan2(x1#-x2#,y1#-y2#)) Mod 360 End Function |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group