Seite 1 von 3

Rotierende Tangente

Verfasst: 16.07.2007 14:28
von Fluid Byte
Vielleicht bin ich zu doof oder einfach nur zu denkfaul aber ich kriegs nicht gebacken eine Line an ihrer Mitte um einen Kreis rotieren zu lassen.

Code: Alles auswählen

#WIDTH = 350 : #HEIGHT = 350 : #WSPACE = 40

CreateImage(0,#WIDTH + (#WSPACE * 2),#HEIGHT + (#WSPACE * 2))

OpenWindow(0,0,0,#WIDTH + (#WSPACE * 2),#HEIGHT + (#WSPACE * 2),"void",#WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
ImageGadget(0,0,0,0,0,ImageID(0))

SetWindowColor(0,0)

SetTimer_(WindowID(0),0,40,0)

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
	Static Angle = 45
	
	Select uMsg
		Case #WM_TIMER		
		Angle + 1
		
		StartDrawing(ImageOutput(0))
		Box(0,0,#WIDTH + (#WSPACE * 2),#HEIGHT + (#WSPACE * 2))
		Circle((#WIDTH / 2) + #WSPACE,(#HEIGHT / 2) + #WSPACE,11,#Red)
		DrawingMode(4)
		Circle((#WIDTH / 2) + #WSPACE,(#HEIGHT / 2) + #WSPACE,#WIDTH / 2,#HEIGHT / 2)
		DrawingMode(0)
		
		X1 = Cos((Angle - 45) * #PI/180) * #WIDTH/2
		Y1 = Sin((Angle - 45) * #PI/180) * #HEIGHT/2
		X2 = Cos((Angle + 45) * #PI/180) * 100
		Y2 = Sin((Angle + 45) * #PI/180) * 100
		
		FX = X1 + (#WIDTH / 2) + #WSPACE
		FY = Y1 + (#HEIGHT / 2) + #WSPACE
		
		LineXY(FX,FY,FX + X2,FY + Y2,#Green)
		StopDrawing()
		SetGadgetState(0,ImageID(0))		
	EndSelect
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

While WaitWindowEvent() ! 16 : Wend

Verfasst: 16.07.2007 16:14
von Kaeru Gaman

Code: Alles auswählen

      X1 = Cos((Angle - 90) * #PI/180) * #WIDTH/2
      Y1 = Sin((Angle - 90) * #PI/180) * #HEIGHT/2
      X2 = Cos((Angle + 90) * #PI/180) * #WIDTH/2
      Y2 = Sin((Angle + 90) * #PI/180) * #HEIGHT/2 
      LineXY(X1,Y1,X2,Y2,#Green)
meist du so?

Verfasst: 16.07.2007 16:19
von Fluid Byte
Nein, hab mich aber auch schlecht ausgedrückt. Ich meine die Line soll flach am Kreis anliegen. Nur halt in der Mitte (nicht des Kreises, der Linie). Im Moment liegt die Koordinate X1/Y1 genau auf dem Kreis. Soll sie aber nicht, sondern X1/Y2 soll entsprechend des Winkels nach oben/unten und links/rechts versetzt werden.

Verfasst: 16.07.2007 16:50
von Kaeru Gaman
achso.. eine rotierende tangente...

werd ich glei mal aufdröseln...

Verfasst: 16.07.2007 16:54
von PureLust
Meinst Du jetzt einfach so?

Code: Alles auswählen

      LineXY(FX-X2,FY-Y2,FX + X2,FY + Y2,#Green) 

Verfasst: 16.07.2007 17:06
von Kaeru Gaman
@PL geht schon stark in die richtung...

so müßte es funzen:

Code: Alles auswählen

#Linelength = 100
#Radius = #HEIGHT / 2
#CenterX =  (#WIDTH / 2) + #WSPACE
#CenterY =  (#HEIGHT / 2) + #WSPACE

;....
      Circle(#CenterX, #CenterY, #Radius, #Yellow) 
      X1 = Cos((Angle - 90) * #PI/180) * #Linelength/2
      Y1 = Sin((Angle - 90) * #PI/180) * #Linelength/2
      X2 = Cos((Angle + 90) * #PI/180) * #Linelength/2
      Y2 = Sin((Angle + 90) * #PI/180) * #Linelength/2 
      FX = #CenterX + Cos((Angle) * #PI/180) * #Radius
      FY = #CenterY + Sin((Angle) * #PI/180) * #Radius
      LineXY(FX + X1, FY + Y1, FX + X2, FY + Y2,#Green)
btw... kann Circle überhaupt ne ellipse zeichnen?

[edit]
ne, kann er nich...
hab den code oben überarbeitet, hatte auch das offset vom mittelpunkt vergessen...

Verfasst: 16.07.2007 17:20
von Fluid Byte
PureLust hat geschrieben:Meinst Du jetzt einfach so?

Code: Alles auswählen

      LineXY(FX-X2,FY-Y2,FX + X2,FY + Y2,#Green) 
* Mpffhhhh * >_<

Exakt so meinte ich es! Bild

Bleibt aber noch eine Frage. Wenn die Linie komplett links ist liegt die Mitte genau auf dem Kreis. Beim Start rechts aber nicht. Sie ist 1 Pixel zu weit noch rechts verstetzt.

Guckst du hier wie isch mein:
Bild

[edit]
@Kaeru: Guter code aber gleiches Problem.
[/edit]

Verfasst: 16.07.2007 17:32
von PureLust
Fluid Byte hat geschrieben:Bleibt aber noch eine Frage. Wenn die Linie komplett links ist liegt die Mitte genau auf dem Kreis. Beim Start rechts aber nicht. Sie ist 1 Pixel zu weit noch rechts verstetzt.
Könnte an einem Rundungsfehler bei der Circle-Funktion liegen (musst in solchen Fällen 0.5 hinzu addieren).

Nimm einfach : #WIDTH = 351 : #HEIGHT = 351, dann passts.

Kleiner Tip: Wenn Du für X1,X2,Y1,Y2,FX,FY Floats nimmst, sieht die Bewegung Deiner Linie weicher aus und ist nicht so sprunghaft.

Verfasst: 16.07.2007 18:40
von STARGÅTE
den Code kann man noch schneller machen :

Code: Alles auswählen

X1 = Cos((Angle - 90) * #PI/180) * #Linelength/2 
Y1 = Sin((Angle - 90) * #PI/180) * #Linelength/2 
X2 = Cos((Angle + 90) * #PI/180) * #Linelength/2 
Y2 = Sin((Angle + 90) * #PI/180) * #Linelength/2 

Code: Alles auswählen

b.f = Angle*#PI/180
X1 = sin(b) * #Linelength/2 
Y1 = -cos(b) * #Linelength/2 
X2 = -sin(b) * #Linelength/2 
Y2 = cos(b) * #Linelength/2 
und dann so ^^

Code: Alles auswählen

b.f = Angle*#PI/180
X0 = sin(b) * #Linelength/2 
Y0 = -cos(b) * #Linelength/2 
LineXY(FX + X0, FY + Y0, FX - X0, FY - Y0,#Green)

Verfasst: 16.07.2007 20:43
von Fluid Byte
Kannste machen was de willst. Die Linie ist immer 1 Pixel zu weit rechts. Wie kann ich das beheben?