Fisheye Menu

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

PowerProgrammer

Betreff: Fisheye Menu

BeitragDi, Mai 29, 2007 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Blitzer!

Ihr kennt doch sicher diese Menüleiste vom Mac mit dem Fisheye-Effekt. Sowas möchte ich gerne nachprogrammieren. Allerdings habe ich momentan ein Brett vor dem Kopf, nichts geht, wie es soll. Deshalb fange ich nochmal an. Aber ich benötige mal eure Hilfe, da ich nicht genau weiß, wie ich das machen soll, dass die Teile auseinandergehen, wenn sie größer werden.

Hier habe ich mal Pseudocode:
Code: [AUSKLAPPEN]
Repeat
   For I = 1 To AnzahlMenüpunkte
      // Erstmal die Distanz zu dem Objekt (Origin is die Midde)
      Dist = Sqr((ObjektPositionX(Obj(I))-MouseX)^2+(ObjektPositionY(Obj(I))-MouseY)^2)
      If Dist > MMax Then Dist = MMax
      If Dist < MMin Then Dist = MMin
      // Hier muss das jetzt berechnet werden und so
   Next
Forever


Das ist ja klar, aber wie berechne ich das nun. Kann das jemand den Ansatz auf Deutsch erklären?

Naja, hab halt ein Brett vor der Birne. Vielen Dank, PowerProgrammer

PS: Iwas wollte ich noch sagen, das habe ich aber vergessen.
PPS: Das Forum ist auch falsch, glaube ich.
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

ZaP

BeitragDi, Mai 29, 2007 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Du lässt die Objekte einfach so "drawen", dass der Abstand immer gleich groß ist, also z.b.

Code: [AUSKLAPPEN]

Temp1 = 0
DrawImage item1,0,0
Temp1 = Temp1 + ImageWidth(item1) + 10,0
DrawImage item2, Temp1,0
Temp1 = Temp1 + ImageWidth(item2) + 10,0

....



So würde ichs Probieren...
Starfare: Worklog, Website (download)

PowerProgrammer

BeitragDi, Mai 29, 2007 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Jau, soweit war ich schon.
Aber dann wird das Teil nach rechts hin länger und der Linke Rand ist immer gleich. Das geht natürlich net, das Teil muss gleichmäßig zu beiden Seiten breiter werden. Und das Teil dann einfach neu zu positionieren geht auch nicht, weil sich der Button dann ja bewegt und der Abstand zum Cursor ein anderer wird.

Oder habe ich nen Denkfehler?

EDIT: http://interface.eyecon.ro/demos/fisheye.html <-- da gut zu sehen
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

ZaP

BeitragDi, Mai 29, 2007 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, du denkst richtig Razz

Dann probiers so:

Code: [AUSKLAPPEN]

type button
 field zoomfactor
 field active
 field image
 field id
end type

b.button = new button
b\image = image1
b\active = 0
b\zoomfactor = 1
b\id = 1

...

for b.button = each button
if MouseIsOver(b\image)
 b\active = 1
endif

b\active = 1
b\zoomfactor = 3

;-> an der stelle muss man irgendwie die zoomfaktoren der umliegenden Buttons ändern, kann man mit der ID machen, fällt mir aber grad nich ein, wie ^^

next


Vielleicht kann man den Zoomfaktor noch etwas genauer mit der Cursordistanz machen..
Starfare: Worklog, Website (download)

Xeres

Moderator

BeitragDi, Mai 29, 2007 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde das ungefähr so angehen:

Code: [AUSKLAPPEN]

Type Ticon
field x, y, image, breite, höhe
End Type

for i = 1 to 5
;**** Fünf Types zum testen erstellen
next

;*** Abstand zwischen Maus und Bild messen (am besten Midhandle)

for icon.Ticon = Each Ticon
;*** x, y, Breite und höhe je nach Abstand zur Maus aktualisieren
next


Dabei muss zu Anfang jeder Type da anfangen wo der vorhergehende aufgehört hat (logisch Rolling Eyes ) und dann je nach breite, höhe, des Types daneben verschoben werden.

Edit:
Da war einer schneller mit den Types ^^ Wenn Breite und Höhe gleich sind macht es auch ein einziger zoomfaktor...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

PowerProgrammer

BeitragDi, Mai 29, 2007 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Grml, sehr nett, dass ihr euch so viel Mühe macht, aber ich habe des immernoch nicht verstanden. ICh glaube, ich brauche Hilfe mal ganz auf Deutsch mit wenig Beispielcode, damit ich das verstehe, was ihr wollt Confused
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

BladeRunner

Moderator

BeitragMi, Mai 30, 2007 6:12
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.
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

Xeres

Moderator

BeitragMi, Mai 30, 2007 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, wir brauchen zu jedem Bild ein Paar Informationen. Damit es keine Verwechslungen gibt und alles hübsch ordentlich ist, legen wir einen Type an.
Dann müssen wird den Abstand zwischen dem Mittelpunkt jeden Bildes und den Mauskoordinaten Messen und je nach nähe den "zoomfaktor" einstellen.
Dann gegen wir alle Types durch, und ordnen sie in der richtigen größe an der richtigen Position an.

Tutorials auf www.robsite.de und die Onlinehilfe von www.blitzbase.de zu Types könnten deinem Verständnis hilfreich sein Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

PowerProgrammer

BeitragDo, Mai 31, 2007 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Grml, das ist doch klar, so weit war ich schon Laughing Das ist auch net mein Problem.
Ich benötige Infos über das Anordnen, das habe ich noch nicht so ganz raus. Das Platzieren muss mir mal einer erklären^^
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

BladeRunner

Moderator

BeitragDo, Mai 31, 2007 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab da mal rasch was zusammengestümpert, weil ich das Problem recht interessant fand. Das Ganze ist sehr unsauber und auch recht spezifisch, um es allgemeiner zu nutzen wirst Du es also neu aufsetzen müssen.

Grundsätzlich wird erstmal der Abstand zu der 'Theoretischen' Position des Icons bestimmt, anhand des Abstandes dann die Grösse bestimmt. Die Grössen geben dann - aufaddiert- eine Länge des Gesamten Menubalkens. Der wird von einer Mittelposition aus gezeichnet. Die Bestimmung welcher Button gewählt ist erfolgt dann anhand der tatsächlichen Koordinaten der einzelnen Items.
Ich hoffe es ist verständlich so.
Code: [AUSKLAPPEN]

Type TIcon
   Field x
   Field y
   Field zoom#
   Field size
   Field actualX
End Type

local mitte
anz = 8

Graphics 800,600
setbuffer Backbuffer()
For i = 1 To anz
   b.Ticon = New Ticon
   b\x = i*64+100
   b\zoom = 1.0
   b\size = 64
   mitte = mitte +b\x
Next
mitte = mitte /anz
Repeat
   Cls
      g=Updateicons()
      Drawicons(g,mitte)
      active = GetActive()
      Text 0,0,g+"  "+mitte+" "+active      
   Flip
Until KeyHit(1)


Function Drawicons(groesse,mitte)
   currX = mitte - (groesse/2)
   For a.Ticon = Each TIcon
      a\actualX = currX
      Rect currX,a\y,a\size*a\zoom,a\size*a\zoom,0
      currX = currX+(a\size*a\zoom)
   Next
End Function

Function UpdateIcons()
   mx = MouseX()
   my = MouseY()
   For a.Ticon = Each Ticon
      If dist(mx-(a\x+(a\size/2)),my-(a\y+(a\size/2))) < a\size*2 Then
      a\zoom = 1.0+ (2*((a\size*2)-dist(mx-(a\x+(a\size/2)),my-(a\y+(a\size/2)))))/(a\size*4)
      Else
      a\zoom = 1.0
      EndIf
   groesse = (groesse + a\size * a\zoom)   
   Next
   Return groesse
End Function

Function Dist#(a#,b#)
   Return Sqr(a^2+b^2)
End Function

Function GetActive()
   x = MouseX()
   y = MouseY()
   For a.TIcon = Each TIcon
   count = count +1
      If x >= a\actualx And x <= a\actualx + (a\size*a\zoom) Then
         If y >= a\y And y <= a\y + (a\size * a\zoom) Then
            Return count
         EndIf
      EndIf
   Next
   Return -1
End Function


EDIT: Code etwas verbessert, Globale rausgeschmissen, Backuffer hinzugefügt, Anzahl beliebig gestaltet. Danke an den nörgelnden Schweizer für den Motivationsschub.
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

PowerProgrammer

BeitragDo, Mai 31, 2007 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Morgen werde ich das mal ausprobieren, vielen dank, blade.

war der nörgeler darth? Ein guter vater^^
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group