Mathematisches Problem

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Schoppy

Betreff: Mathematisches Problem

BeitragDo, März 08, 2012 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

vielleicht kennt hier einer eine Lösung für mein Problem:

Also ich habe ein Canvas und hier zeichne ich ein 400 x 400 Pixel Großes Bild. Per Mausklick im Canvas wird eine Linie von Oben nach unten gezeichnet, als Hilfslinie. Soweit so Gut.

Jetzt wird das Bild per Mausrad gezoom sprich vergrößert.

Code: [AUSKLAPPEN]

Global  zoom_multiplikator:Float = 100
Global image_zoom:Float = 0

image_zoom = image_zoom + 1


Damit jetzt die Linie an der Position im Image bleibt, berechne ich

Code: [AUSKLAPPEN]


'berechne zuerst wert pro Pixel
Local wertPixel:Float = (image_zoom * zoom_multiplikator) / ImageWidth(Image)

'jetzt berechne wert verschiebung für Line      
Local pos_line:Float = line_posX * wertPixel


DrawLine(line_posX + pos_line, 0, line_posX + pos_line, 500)




Ok, als Beispiel:

line_posX_bei_zoom0 = 20

image_zoom = 1
zoom_multiplikator = 1000

wertPixel:Float = (image_zoom * zoom_multiplikator) / ImageWidth(Image) '(1 * 1000) / 400 = 2,5
pos_line:Float = line_posX_bei_zoom0 * wertPixel ' 20 * 2,5 = 50

line_pos_Neu = line_posX_bei_zoom0 + pos_line '20+50


Die Linie muss alSo bei Zoom 1x bei 70 gezeichnet werden.

Das funktioniert auch Super beim rein und rausZoomen.


Jetzt möchte ich aber im gezoomten Status die Linien Position korrigieren.

Das heißt:
line_pos_Neu erhält einen neuen wert z.b.60


Wie errechne ich jetzt line_posX_bei_zoom0 ???


Einfach aufgeschreiben:

x = ?
x * 2, 5 = ?
x + ? = 60

Holzchopf

Meisterpacker

BeitragDo, März 08, 2012 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe deinen Weg nicht ganz. Wieso rechnest du zuerst einen "Wert pro Pixel"? Und wieso hast du einmal image_zoom und einmal zoom_multiplikator?
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

PhillipK

BeitragDo, März 08, 2012 20:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab grade mal n kleinen Testcode gebastelt.

Da ich deinen Weg auch nicht ganz verstehe, habe ich einfach meinen ansatz umgesetzt.
Basierend auf Zoom, Bildbreite (wahlweise auch bildschirmbreite!) und MouseX()

Der obere Teil ist irrelevant, der malt ein kleines Testbild.

Unten in der hauptschleife wird der Zoomfaktor per Pfeilhoch / pfeil runter verändert und dann mit SetScale() gesetzt. Damit du siehst, das SetScale die linien nicht beeinflusst, setze ich sie jeden Frame neu. Ist zwar ein wenig dirty gelöst, aber es funktioniert Smile

Die Position der Hilfslinie wird mit (MouseX() / (bildBreite * zoom)) als faktor gerechnet.
Hinterher, beim Zeichnen, wird die X position mit faktor*zoom*bild_breite wieder zurückgerechnet.

BlitzMax: [AUSKLAPPEN]
SuperStrict


Graphics(800, 800) 'doppelt so groß wie das bild, erstmal :)

Local imgW:Int = 400 'breite vom Bild
Local imgH:Int = 400 'höhe vom Bild

Local image:TImage = CreateImage(imgW, imgH, 1) 'testbild

'--------------------------------------------------------
'testbild mit random zeugs füllen
SetClsColor(255, 255, 255) 'hintergrundfarbe weiß :D
Cls

For Local i:Int = 0 Until 100
Select Rand(0, 1)
Case 0 'rect zeichnen
SetColor(Rand(0, 255), Rand(0, 255), Rand(0, 255))
DrawRect(Rnd(0, 200), Rnd(0, 200), Rnd(50, 200), Rnd(50, 200))
Case 1 'oval zeichnen
SetColor(Rand(0, 255), Rand(0, 255), Rand(0, 255))
DrawOval(Rnd(0, 200), Rnd(0, 200), Rnd(50, 200), Rnd(50, 200))
End Select
Next
GrabImage(image, 0, 0, 0) ' Testbild mit dem Zeug füllen

SetClsColor(0, 0, 0) 'hintergrundfarbe schwarz
Cls 'leeren
SetColor(255, 255, 255) ' zurücksetzen

'---------------------------------------------------
Local timer:TTimer = CreateTimer(60) 'performance sache..

Local helpLines:Float[] 'hier kommen die hilfslinien rein.
Local zoom:Float = 1

While Not KeyHit(KEY_ESCAPE) And Not AppTerminate()
Local val:Float = KeyDown(KEY_UP) - KeyDown(KEY_DOWN) 'hoch / runter Keydown abfrage (wert ist -1 , 0 oder 1)
If val <> 0 Then 'wenn pfeiltastne gedrückt wurden..
zoom:+(val / 100.0)
If zoom < 0.5 Then zoom = 0.5
If zoom > 10 Then zoom = 10.0

End If
SetScale(zoom, zoom)
If MouseHit(1) Then
Local line_x:Float = Float(MouseX()) ' Mausposition bestimmen.
Local line_proz:Float = line_x / (imgW * zoom) 'durch die bild-breite * zoom teilen! Ergibt einen Faktor, den man mit Bildbreite und zoom skalieren kann.
helpLines:+[line_proz] 'hinten in die Hilfslinien liste einfügen.
End If

Cls


DrawImage(image, 0, 0)
SetScale(1,1)
For Local i:Int = 0 Until Len(helpLines)
DrawLine(helpLines[i] * imgW * zoom, 0, helpLines[i] * imgW * zoom, GraphicsHeight())
'Helplines[i] ist der Faktor, der beim erstellen errechnet wurde. Skaliert mit BildBreite und Zoom bleibt die position gleich.
Next

Flip 0
WaitTimer(timer)
Wend
 

Schoppy

BeitragDo, März 08, 2012 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, danke dir für die Mühe.

Es funktioniert.

SetScale zu nutzen, daran habe ich garnicht gedacht.

Gruß
Schoppy

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group