IsInsideStroke() will nicht so, wie ich will

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

IsInsideStroke() will nicht so, wie ich will

Beitrag von HeX0R »

Moinsen,

das Vectorzeug bekomme ich irgendwie nicht so richtig in die weiche (und alte) Birne.
Ich habe hier das Beispiel aus dem Handbuch zu IsInsideStroke() benutzt, um es für meine Zwecke zu nutzen.
Es sollte also auch die Farbe wechseln, sobald die Maus sich auf dem Pfad befindet, aber egal, was ich probiere, es haut nie hin.
Vermutlich hängt das mit Scale- und TranslateCoordinates() zusammen, die brauche ich aber im Endprodukt tatsächlich.

Kann mich bitte jemand erleuchten?
Hier der Code:

Code: Alles auswählen

Procedure Draw()
	Protected x.d, y.d, Width.d, w, h
	
	x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
	y = GetGadgetAttribute(0, #PB_Canvas_MouseY)

	If StartVectorDrawing(CanvasVectorOutput(0))
		VectorSourceColor($FFFFFFFF)
		FillVectorOutput()
		w     = VectorOutputWidth()
		h     = VectorOutputHeight()
		Width = 0.0000002641
		FlipCoordinatesY(h / 2)
		ScaleCoordinates(13.3333333333, 3786996.0382195143)
		TranslateCoordinates(0, -0.0067893411)
		AddPathSegments("M 1 0.006883684 L 2 0.006883743 L 3 0.006882627 L 4 0.006880347 L 5 0.006877271 L 6 0.006873311 L 7 0.006868782 L 8 0.006863712 " + 
		                "L 9 0.006858186 L 10 0.006852056 L 11 0.006845856 L 12 0.006839717 L 13 0.006834028 L 14 0.006828995 L 15 0.006824892 " +
		                "L 16 0.006821816 L 17 0.006819845 L 18 0.006818386 L 19 0.006817529 L 20 0.006816264 L 21 0.006814703 L 22 0.006812286 " +
		                "L 23 0.006809421 L 24 0.006806085 L 25 0.006802817 L 26 0.006800089 L 27 0.006798427 L 28 0.006797923 L 29 0.006799454 " +
		                "L 30 0.006802433 L 31 0.006806633 L 32 0.006811704 L 33 0.006817185 L 34 0.006822824 L 35 0.006827743 L 36 0.0068322 " +
		                "L 37 0.006835851 L 38 0.006839383 L 39 0.006842413 L 40 0.00684561 L 41 0.006849194 L 42 0.006853179 L 43 0.006857547 " +
		                "L 44 0.006862035 L 45 0.00686658 L 46 0.006870781 L 47 0.006874538 L 48 0.006877611 L 49 0.006880157 L 50 0.006881801 " +
		                "L 51 0.00688287 L 52 0.006883375 L 53 0.00688327 L 54 0.006882146 L 55 0.006880147 L 56 0.006877121 L 57 0.006872884 " +
		                "L 58 0.006868 L 59 0.006862468 L 60 0.006856883")

		If IsInsideStroke(x, y, Width, #PB_Path_Default, #PB_Coordinate_Device)
			VectorSourceColor(RGBA(0, 255, 0, 255))
		Else
			VectorSourceColor(RGBA(0, 0, 255, 255))
		EndIf
		StrokePath(Width)
		StopVectorDrawing()
	EndIf
EndProcedure

If OpenWindow(0, 0, 0, 400, 200, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CanvasGadget(0, 0, 0, 400, 200)
	Draw()

	Repeat
		Event = WaitWindowEvent()

		If Event = #PB_Event_Gadget And EventGadget() = 0 And EventType() = #PB_EventType_MouseMove
			Draw()
		EndIf

	Until Event = #PB_Event_CloseWindow
EndIf
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: IsInsideStroke() will nicht so, wie ich will

Beitrag von Nino »

Code: Alles auswählen

      ResetCoordinates()
      If IsInsideStroke(x, y, Width, #PB_Path_Default, #PB_Coordinate_Device)
         VectorSourceColor(RGBA(0, 255, 0, 255))
      Else
         VectorSourceColor(RGBA(0, 0, 255, 255))
      EndIf
Füge mal ResetCoordinates() ein.
Und den 3. Parameter von IsInsideStroke() würde ich etwas größer machen, sonst ist es schwer die dünne Linie mit der Maus zu treffen.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: IsInsideStroke() will nicht so, wie ich will

Beitrag von HeX0R »

Ahrgh... o.k. das war dann wohl ein Mißverständnis, ich dachte ich dürfe die Koordinaten erst NACH dem Zeichnen zurücksetzen.
Sehr schön, vielen Dank für den Schubs!

Ja klar, die Width mache ich dann größer, es ging erst mal allgemein um die Funktion.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: IsInsideStroke() will nicht so, wie ich will

Beitrag von HeX0R »

Muss doch nochmal nachhaken.

Laut Beschreibung kann das Koordinatensystem #PB_Coordinate_Device nicht verändert werden und repräsentiert immer die Bildfläche (in diesem Fall das Canvas).
Also müsste mein ursprünglicher Code doch auch ohne das ResetCoordinates() funktionieren, das ja nur das User-Koordinatensystem zurücksetzt?

Und IsInsideStroke verhält sich irgendwie immernoch merkwürdig, siehe hier z.B.:

Code: Alles auswählen

Procedure draw()
	If StartVectorDrawing(CanvasVectorOutput(0))
		VectorSourceColor($FFFFFFFF)
		FillVectorOutput()
		ResetCoordinates()
		ScaleCoordinates(10, 100000)
		TranslateCoordinates(0.1, 0.0013)
		AddPathSegments("M 10 0.0001 L 20 0.003 L 30 0.0001 L 40 0.003")
		;o.k.:
		Debug IsInsideStroke(20, 0.003, 0.01, #PB_Path_Default, #PB_Coordinate_User)
		;why??
		Debug IsInsideStroke(20, 0.100, 0.000001, #PB_Path_Default, #PB_Coordinate_User)
		VectorSourceColor(RGBA(255, 0, 0, 255))
		StrokePath(0.01)
		StopVectorDrawing()
	EndIf
EndProcedure

If OpenWindow(0, 0, 0, 1000, 500, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CanvasGadget(0, 0, 0, 1000, 500)
	draw()
	
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Mir scheint, das funktioniert gar nicht mit x/y < 1? Oder aber ich bin mal wieder zu doof, das zu verstehen.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: IsInsideStroke() will nicht so, wie ich will

Beitrag von Nino »

HeX0R hat geschrieben:Laut Beschreibung kann das Koordinatensystem #PB_Coordinate_Device nicht verändert werden und repräsentiert immer die Bildfläche (in diesem Fall das Canvas).
Also müsste mein ursprünglicher Code doch auch ohne das ResetCoordinates() funktionieren, das ja nur das User-Koordinatensystem zurücksetzt?
Ich verstehe es so:
Du hast im Koordinatensystem #PB_Coordinate_User gezeichnet, welches anfänglich mit #PB_Coordinate_Device übereinstimmt. Nach FlipCoordinatesY() etc. stimmen die beiden Koordinatensysteme nicht mehr überein. Gegen Ende machst Du die Prüfung mit IsInsideStroke() im Koordinatensystem #PB_Coordinate_Device, was erst funktionieren kann nachdem das Koordinatensystem #PB_Coordinate_User mittels ResetCoordinates() wieder in Übereinstimmung mit #PB_Coordinate_Device gebracht wurde.

Eine Alternative ist:

Code: Alles auswählen

      ResetCoordinates()
      If IsInsideStroke(x, y, Width, #PB_Path_Default, #PB_Coordinate_User)
         VectorSourceColor(RGBA(0, 255, 0, 255))
      Else
         VectorSourceColor(RGBA(0, 0, 255, 255))
      EndIf
(#PB_Path_Default und #PB_Coordinate_User kann man auch weglassen, weil das die Default-Werte sind.)

Zu Deiner 2. Frage:
Ich weiß auch nicht was da los ist.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: IsInsideStroke() will nicht so, wie ich will

Beitrag von HeX0R »

Vielen Dank für Deine Hilfe, ich hatte gehofft dass noch ein paar mehr "Vector-Freaks" mit Anworten kommen.
Vermutlich war die Frage aber im deutschen Board deplatziert, ich werde das mal etwas aufarbeiten und im englischen Board nachfragen.

Das mit den ResetCoordinates ist ja ganz nett, aber beraubt mich der Möglichkeit die echten PfadWerte so einfach zu bekommen.
Im echten Programm ist es natürlich nicht genug zu wissen, ob der Cursor auf einem Pfad ist, ich brauche auch die hinterlegten Werte.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: IsInsideStroke() will nicht so, wie ich will

Beitrag von Nino »

HeX0R hat geschrieben:noch ein paar mehr "Vector-Freaks"
Das ist ein schönes Wortspiel, denn "Freak" (Timo) hat ja die Vektor-Bibliothek geschrieben. Schade, dass er hier kaum noch oder gar nicht mehr schreibt.
Nähere Informationen zu diesem Thema würden mich auch interessieren. :-)
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: IsInsideStroke() will nicht so, wie ich will

Beitrag von HeX0R »

Kannst ja dann hier mitlesen.
Antworten