Seite 1 von 1

IsInsideStroke() will nicht so, wie ich will

Verfasst: 26.04.2020 13:55
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

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

Verfasst: 26.04.2020 14:58
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.

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

Verfasst: 26.04.2020 15:10
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.

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

Verfasst: 26.04.2020 19:44
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.

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

Verfasst: 26.04.2020 21:22
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.

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

Verfasst: 26.04.2020 22:25
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.

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

Verfasst: 26.04.2020 22:43
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. :-)

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

Verfasst: 26.04.2020 23:11
von HeX0R
Kannst ja dann hier mitlesen.