Rotierende Tangente

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Rotierende Tangente

Beitrag 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
Zuletzt geändert von Fluid Byte am 16.07.2007 20:47, insgesamt 2-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

achso.. eine rotierende tangente...

werd ich glei mal aufdröseln...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Meinst Du jetzt einfach so?

Code: Alles auswählen

      LineXY(FX-X2,FY-Y2,FX + X2,FY + Y2,#Green) 
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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]
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Kannste machen was de willst. Die Linie ist immer 1 Pixel zu weit rechts. Wie kann ich das beheben?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten