Hallo Besucher, der Thread wurde 3,5k mal aufgerufen und enthält 14 Antworten

letzter Beitrag von Haubitze am

Maßstabsfaktor oder? Skalierungsfaktor bestimmen

  • Hallo,


    entweder ich bin ganz blöde oder nur in Mathe, aber ich komme hier nicht dahinter.


    Angenommen, ich habe eine Strecke x1 = -100 bis x2 = +100, meine Oberfläche geht aber nur zB von xa = -60 bis xe = +60. Wie bestimme ich nun den Faktor, den ich mit x1 und x2 (multiplizieren?) muss, damit diese in die genannte Fläche maßstabsgetreu passen?


    Danke und LG

  • Das sieht ja soweit alles symmetrisch aus, es also immer von plus bis minus der gleichen Zahl geht. Das spart schonmal ein Kopfzerbrechen über die Lage des Nullpunkts, und es reicht, den Faktor mit +100 und +60 auszurechnen.
    Du willst aus 100 eine 60 machen. Dazu multiplizierst Du mit 0,6. Und 0,6 ist 60/100.

  • Aha, danke.


    Das sieht mir schon fast zu einfach aus ;)
    Diesen Rechenschritt habe ich jetzt doch verstanden :D Wenn der Nullpunkt nicht zentriert ist, sondern ganz am linken Rand der Fläche (bei x=0; y=Fläche_y / 2), sähe dann die Rechnung anders aus?


    Sorry wg solch sonderbaren Fragen, aber ich sitze da schon ne ganze Weile dran.

  • ...
    Diesen Rechenschritt habe ich jetzt doch verstanden :D Wenn der Nullpunkt nicht zentriert ist, sondern ganz am linken Rand der Fläche (bei x=0; y=Fläche_y / 2), sähe dann die Rechnung anders aus?
    ...

    Eigentlich genauso bzw. ist die Suche nach dem Nullpunkt noch einfacher.
    Für beide Achsen hast Du schon im Voraus bestimmt, wo eigentlich die Null liegt, und von dort aus kannst Du dann zählen.
    Wenn Du also X=100 in die Formel gesteckt hast und x1=60 herauskommt, dann zählst Du ab dem linken Rand.
    Und Y=-50 wir zu Y1=-30, und das zählst Du ab Bildschirm-Mitte.


    Ein paar Sachen noch:
    -Zumindest am Cevi ist es üblich, von Y =0 bis 199 zu zählen, und 0 ist oben links. Wenn Du nach Formeln zum Ausrechnen von Speicheradressen suchst, dann zählen die so.
    -Du wirst runden müssen, weil es keine halben Pixel gibt. Ein Pixel deckt also einen ganzen Bereich von Koordinaten ab. Kann man kaufmännisch machen oder nach dem Komma abschneiden. Das Runden von negativen Zahlen könnte speziell werden, und Du könntest merken, dass in den 200 Pixeln kein Platz für -100 bis +100 ist. Mach Dir mal ne Zeichnung mit 4 Kästchen/Pixeln und schreib daneben, welchen Zahlenbereich jedes Pixel erfassen soll.
    -Beides zusammen: Du fährst beim Pixeln besser, wenn Deine Zielkoordinaten nicht -100 bis +100, sondern 0 bis 199 bzw. 1 bis 200 ergeben sollen. Addier am Ende der Rechnung 100 auf Y drauf, das passt schon.

  • Also danke erstmal.


    Die Formel meine ich jetzt dazu gefunden haben, aber praktisch klappt es noch nicht ganz. Es geht zwar nicht um den C64, aber im Prinzip gehts bei der dortigen Blockgrafik ums selbe. Deshalb übernehme ich mal die Werte.


    Es gibt 39 Spalten und 24 Zeilen. Die x-Weite, die darauf abgebildet werden soll beträgt 100. Die Formel wäre scale_sp = Spalten / x-Weite. Wenn es einen Wert x = 20 gibt, wäre dann die Spalte sp = ( scale_sp * x ) also sp = (39/100) * 20 = 0.39 * 20 = 7.8 aufgerundet auf 8. Soweit stimmt das doch?


    Nun habe ich hier ein ähnliches Feld, welches ich aber um den Faktor 2 in die Breite strecken will. Ich habe also spalten = 39, also verdoppele ich diese und teile ums original.
    scale_sp = spalten / (spalten * 2) = 0.5. Dadurch passiert aber genau das Gegenteil, die x-Werte werden um die Hälfte gestaucht.


    Und jetzt weiß ich nicht weiter. Könnte zwar das Gegenteil machen und die x-Weite halbieren, aber dann kommen nur noch unsinnige Werte bei raus. Kann auch sein, das ich was falsch anwende, keine Ahnung.

  • Es gibt 39 Spalten und 24 Zeilen. Die x-Weite, die darauf abgebildet werden soll beträgt 100. Die Formel wäre scale_sp = Spalten / x-Weite. Wenn es einen Wert x = 20 gibt, wäre dann die Spalte sp = ( scale_sp * x ) also sp = (39/100) * 20 = 0.39 * 20 = 7.8 aufgerundet auf 8. Soweit stimmt das doch?

    Klingt ganz gut. Sind es wirklich 39 Spalten, oder doch die Spalten von 0 bis 39, also 40 Stück? Zählst Du ab 0 oder ab 1? Willst Du die letzte Spalte ausschließlich für den höchsten Wert und die erste Spalte nur für die 0 reservieren, oder jeder Spalte einen gleich großen Wertebereich zuweisen?


    Aber mach erstmal so weiter, über so kleine Details kann man später noch brüten, wenn es Kacke aussieht.

    Nun habe ich hier ein ähnliches Feld, welches ich aber um den Faktor 2 in die Breite strecken will. Ich habe also spalten = 39, also verdoppele ich diese und teile ums original.
    scale_sp = spalten / (spalten * 2) = 0.5. Dadurch passiert aber genau das Gegenteil, die x-Werte werden um die Hälfte gestaucht.

    Dann denk besser, dass Du jetzt nur noch Werte bis 50 statt 100 darstellen kannst.

  • Zählst Du ab 0 oder ab 1?


    Immer ab 0 bis size-1. Wie es sich gehört ;) Aber stimmt, habe mich mit 39 Spalten und 24 Zeilen missverständlich ausgedrückt.


    Dann denk besser, dass Du jetzt nur noch Werte bis 50 statt 100 darstellen kannst.


    Jupp, das ist kein Problem. Wird ja dann alles automatisch umgerechnet, wenn die Achsen neu bestimmt werden.



    (Sorry, kam mit dem Zitieren hier nicht richtig klar)


  • warum machst du im zweiten beispiel nicht einfach das selbe wie im ersten? dann sollte es doch funzen.
    statt sp = (39/100) * 20 einfach sp = (79/100) * 20.


    oder hab ich das ziehl der uebung ncht ganz verstanden?


    gruesse


    edit oh ja du willst ja nich stauchen sondern strecken...


    Code
    1. Function MapValue(value As Single=128.0,value_min As Single=0.0,value_max As Single=255.0,map_min As Single=0.0,map_max As Single=1.0) As Single
    2. Return ((value-value_min)/(value_max-value_min))*(map_max-map_min)+map_min
    3. End Function


    ist zwar FreeBasic kann man bestimmt auch in anderen Sprachen so umsetzen.
    dabei ist value der wert der gemapt werden soll, value_min/max die unter und obergrenze der Orginal daten und map_min/max sind die unter und obergrenze der gemapten werte.


    das sieht sicher nicht schoen aus hab ich mir aber mal in kleinlicher arbeit selber zusammen geschuster, fehlr kann ich leider auch nicht wirklich ausschliesen (auch wenn das bei mir tut was es soll).


    hoffe es hilft dir.


    gruesse

  • also wenn du deine werte so mappen willst wie du sagst dann waere das beispiel von oben so umzu setzen.

    Code
    1. print MapValue(20,-100,100,-60,60)
    2. bzw doppelt so breit
    3. print MapValue(20,-100,100,-120,120)


    alternativ koennte ich noch dieses hier anbieten

    Code
    1. Function kx (x As double,new_window_size as double, orginal_window_size as double) As Double
    2. Return (x*(new_window_size/orginal_window_size))
    3. End Function
    4. print kx(20,39,100)
    5. print kx(20,79,100)


    salute