linie verlängern

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Darren

Betreff: linie verlängern

BeitragDo, Aug 23, 2007 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad

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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Aug 23, 2007 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 23, 2007 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 23, 2007 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Aug 23, 2007 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 23, 2007 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausser Mark wird das wohl niemand mit Sicherheit wissen. Potentiell Möglich wäre deines natürlich auch Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

SpionAtom

BeitragFr, Aug 24, 2007 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group