Linie/Grafik verzerren bzw biegen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

nX^

Betreff: Linie/Grafik verzerren bzw biegen

BeitragDo, Jul 12, 2012 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin immoment ein bisschen am rumspielen... Meine Frage wie ist es am einfachsten bzw die beste Lösung wenn ich z. B. eine senkrechte Linie zeichne und dann mit der Maus neben der Linie hergehe und diese sich dann zur Maus verbiegt (zb in einem Halbkreis) ohne dass sich die Linie von ihren 2 Punkten (Anfang/Ende) wegbewegt? Ich hab ne längere Zeit nicht mehr programmiert und weiß keine Lösung auf mein Problem. Hoffe mir kann jemand schnell helfen. Smile

ToeB

BeitragDo, Jul 12, 2012 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Die schnellste Lösung wäre glaub ich die Linie zu unterteilen, ganz viele Punkte und diese dann immer mit dem Nächsten zu verbinden. Dann, wenn du einen Punkt verschiebst, einfach die anderen Punkte drum herum Interpolieren.. Sollte eingl. ganz gut aussehen Wink

Lg, Tobias
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

nX^

BeitragDo, Jul 12, 2012 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Daran dachte ich auch. Nur hatte gehofft es gäbe eine andere Lösung ^^

ToeB

BeitragDo, Jul 12, 2012 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja gibt es bestimmt mit Splines bzw. Wenn du für jeden Schritt zwischen den Punkten eine Quadratische Funktion ausrechnest.. Aber damit kenn ich mich nicht so aus ^^


Hab mal was zusammen gezimmert, bis auf den ersten Punkt scheints ganz gut zu klappen aber ich glaube nicht dass das das ist was du suchst:

BlitzMax: [AUSKLAPPEN]
SuperStrict 

Const POINTS_VALUE:Int = 20


Type TLine
Field pointx:Float[]
Field pointy:Float[]
Field points:Int
Field maxabs:Float

Method New( )
points = POINTS_VALUE
pointx = New Float[points]
pointy = New Float[points]
End Method

Method Create:TLine( x:Float, y:Float, x2:Float, y2:Float )
Local abx:Float = x2 - x
Local aby:Float = y2 - y
Local ab:Float = Sqr( abx*abx + aby*aby )
Local abx_step:Float = abx / Float( points )
Local aby_step:Float = aby / Float( points )
Local ab_step:Float = Sqr( abx_step*abx_step + aby_step*aby_step )
Local index:Int = 0
For Local i:Float = 0 To ab / ab_step
pointx[index] = x + abx_step * i
pointy[index] = y + aby_step * i
index :+ 1
If index >= points Then Exit
Next
maxabs = ab_step
Return Self
End Method

Method Draw( )
For Local i:Int = 1 To points-1
DrawLine( pointx[i-1], pointy[i-1], pointx[i], pointy[i] )
Next
End Method

Method DragPoint:Int( mx:Float, my:Float )
Local n:Float = 99999999.9
Local n_i:Int = -1
For Local i:Int = 0 To points-1
Local abx:Float = pointx[i] - mx
Local aby:Float = pointy[i] - my
Local ab:Float = Sqr( abx*abx + aby*aby )
If ab < n Then
n_i = i
n = ab
EndIf
Next
Return n_i
End Method

Method SetPoint( index:Int, x:Float, y:Float, up:Byte=True )
If index > 0 And index < points Then
pointx[index] = x
pointy[index] = y
If up Then Update( index )
EndIf
End Method

Method GetPointX:Float( index:Int )
If index > 0 And index < points Then Return pointx[index]
Return 0
End Method
Method GetPointY:Float( index:Int )
If index > 0 And index < points Then Return pointy[index]
Return 0
End Method

Method Update( index:Int )
Local i:Int
For i = index To 0 Step -1
Local x1:Float = GetPointX( i )
Local y1:Float = GetPointY( i )
Local x2:Float = GetPointX( i-1 )
Local y2:Float = GetPointY( i-1 )
Local abx:Float = x2 - x1
Local aby:Float = y2 - y1
Local ab:Float = Sqr( abx*abx + aby*aby )
Local fak:Float = maxabs / ab
SetPoint( i-1, x1 + abx * fak, y1 + aby * fak, False )
Next
For I = index To points-1 Step 1
Local x1:Float = GetPointX( i )
Local y1:Float = GetPointY( i )
Local x2:Float = GetPointX( i+1 )
Local y2:Float = GetPointY( i+1 )
Local abx:Float = x2 - x1
Local aby:Float = y2 - y1
Local ab:Float = Sqr( abx*abx + aby*aby )
Local fak:Float = maxabs / ab
SetPoint( i+1, x1 + abx * fak, y1 + aby * fak, False )
Next
End Method
End Type



Graphics 800, 600
Local timer:TTimer = CreateTimer( 60 )
Local mHit:Byte, point:Int

Local line:TLine = (New TLine).Create( 400, 100, 400, 300 )


Repeat
If MouseHit( 1 ) Then
point = line.DragPoint( MouseX(), MouseY() )
If point > -1 Then
mHit = True
EndIf
EndIf
If mHit = True Then
line.SetPoint( point, MouseX(), MouseY() )
If Not MouseDown( 1 ) Then mHit = False
EndIf
line.Draw( )
Flip 0
Cls
WaitTimer( timer )
Until KeyHit( KEY_ESCAPE ) Or AppTerminate( )
End


Lg, Tobias
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

nX^

BeitragDo, Jul 12, 2012 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja so ähnlich. Die "Festpunkte" sollen sich nicht bewegen. Nur die Linie selber. Vergleichbar mit einem Seil dessen 2 Enden irgendwo festgebunden sind und das Seil selber wird in eine Art Sog gezogen nur nicht Spitz zulaufend sondern in einer Art Halbkreis...
Ich bin ein bisschen am basteln aber es muss doch bestimmt ne etwas einfachere Variante...

BladeRunner

Moderator

BeitragDo, Jul 12, 2012 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
wäre wohl am ehesten mit Beziér-Splines 2.en Grades zu erledigen.
Siehe dazu den Wikipedia-Artikel, und per Forensuche lässt sich wohl auch einiges Finden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

nX^

BeitragDo, Jul 12, 2012 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Spline... Genau sowas in der Art hab ich gesucht. Danke

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group