Autor |
Beitrag |
Kenpachi
      
Beiträge: 30
Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
|
Verfasst: Di 15.03.11 21:30
Guten Abend die Herren. (Oder gibt es hier doch Damen?)
Ich sitze gerade an einem dynamischen Koordinatensystem und verzweifel an einem der Achsenendwerten.
Die Lage is wie folgt. Der zu erwartende Maximalwert auf der Achse ist größer als 0 und kleiner als +∞ und ich kenne den Wert in seiner Basiseinheit (Ohm).
So, da kann ja nun sonstetwas bei raus kommen, mein Achse soll aber eine halbwegs sinnvolle Beschriftung aufweisen.
Sagen wir mal, der Wert ist 832,24Ω, dann wäre ja beispielsweise 1000Ω ein sinnvoller Achsenendwert, oder wenn der Wert 0,781Ω ist, wäre es wohl 1000mΩ. Soweit eigentlich noch relativ einfach, aber wenn der Wert 12,43Ω beträgt, dann kann ich ja nicht gleich bis 100Ω skalieren... da wären 15Ω wohl sinnvoller.
Und genau das bereitet mir Probleme.
Hat da zufällig jemand eine spontane Eingebung, oder einen Ansatz für einen Algorithmus?
MfG Kenpachi
|
|
glotzer
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Di 15.03.11 22:12
hallo,
im anhang ein unit den ich vor einiger zeit mal für ein kleines projekt geschrieben habe, vieleicht kannst du ja was damit anfangen
mfg glotzer
Einloggen, um Attachments anzusehen!
Für diesen Beitrag haben gedankt: Kenpachi
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 15.03.11 22:15
Eigentlich musst du dich "nur" für eine sinnvolle Zahlenfolge für diese Beschriftungen entscheiden, der Algorithmus sollte dann ja nicht mehr das Problem sein. Für deine Beispiele wäre z.B. (nur die Mantisse betrachtend) 1, 1.5, 2, 3, 4, 5, 7.5 passend, aber da es sicher keine Ideallösung gibt (es sei denn, jemand zaubert eine DIN-Norm aus dem Hut  ), wirst du das selbst festlegen müssen  .
_________________ >λ=
Zuletzt bearbeitet von Kha am Di 15.03.11 22:57, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: Kenpachi
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Di 15.03.11 22:18
Hei Kenpachi,
ich würde meinen Ansatz so wählen, dass du im Bereich von 100% bis 125% (den Wert musst du vielleicht noch austarieren) eine Zahl in der Form von 1*10^k oder 1,5*10^k suche. Wenn du einen gefunden hast, schön, wenn nicht, musst du dich entscheiden, ob du den Bereich vergrößerst oder auch andere Werte zulässt wie 1,2+10^k (und k>1) o.ä.
Gruss,
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Für diesen Beitrag haben gedankt: Kenpachi
|
|
Kenpachi 
      
Beiträge: 30
Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
|
Verfasst: Di 15.03.11 22:28
Danke, glotzer.
Auch wenn ich noch nie Pascal gelesen habe, kann ich mich doch ganz gut zurecht finden, aber ich habe das Gefühl, dass genau der Part, der mich interessiert, fehlt.
In der Prozedur TGraphManager.DrawTo "loop'st" du ja durch die Variable ScaleMarks und gibst dann einen Wert aus, der von der Variable Size abhängt.
Genau diese Variable - Size - interessiert mich ja, nur finde ich nirgendwo eine Deklaration/Initialisierung. Kannst du mir da noch auf die Sprünge helfen?
//EDIT:
@Kha:
Klingt auch interessant, da denke ich auf jeden Fall drüber nach.
@der organist:
Ich denke mal, das wird dann zu ungenau, aber probieren könnte man es auf jeden Fall auch mal.
MfG Kenpachi
|
|
glotzer
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Di 15.03.11 23:16
oh, entschuldigung, die waren also options woanders:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| const MarkPointsColor = clGreen; FColor = clBlue; BColor = clGreen; GraphColor = clRed; ScaleColor = clBlue; Size: Cardinal = 500; Scale_Left_OffSet = 25; Scale_Down_OffSet = 25; ScaleMarks = 10;
Const E_V = 'm/s'; E_T = 's'; E_a = 'm/s^2'; E_s = 'm'; |
war damals ein diagramm für physikalische beschleinigung.
im grunde unterteil ich nur den maximalwert in 10 "abschnitte" und beschrifte die.
|
|
Kenpachi 
      
Beiträge: 30
Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
|
Verfasst: Mi 16.03.11 00:01
Ich habe es nun mit Kha's Vorschlag umgesetzt, das ging eigentlich ohne Probleme und ist schön simpel.
Es als Option zu setzen kam mir auch in den Sinn, aber ich wollte es dann doch etwas dynamischer, da es ein Projekt ist, das am Ende bewertet wird.
So sieht das ganze jetzt aus (falls es interessiert):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| float[] maxX = new float [] { 0.1F, 0.2F, 0.3F, 0.4F, 0.5F, 0.6F, 0.7F, 0.8F, 0.9F, 1, 1.25F, 1.5F, 1.75F, 2, 2.25F, 2.5F, 3, 3.5F, 4, 4.5F, 5, 5.25F, 6, 6.75F, 7.5F, 8, 9, 10, 12.5F, 15, 17.5F, 20, 22.5F, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 125, 150, 175, 200, 225, 250, 300, 350, 400, 450, 500, 525, 600, 675, 750, 800, 900, 1000}; while (maxR4 > maxX[maxX.Length - 1]) maxR4 /= 1000;
int maxX_index = 0; while (maxR4 > maxX[maxX_index]) maxX_index++;
int scalemarks_x; if (maxX[maxX_index] <= 1) scalemarks_x = 10; else if (maxX[maxX_index] <= 2.5F) scalemarks_x = (int)(maxX[maxX_index] / 0.25F); else if (maxX[maxX_index] <= 5) scalemarks_x = (int)(maxX[maxX_index] / 0.5F); else if (maxX[maxX_index] <= 7.5F) scalemarks_x = (int)(maxX[maxX_index] / 0.75F); else if (maxX[maxX_index] <= 10) scalemarks_x = (int)maxX[maxX_index]; else if (maxX[maxX_index] <= 25) scalemarks_x = (int)(maxX[maxX_index] / 2.5F); else if (maxX[maxX_index] <= 50) scalemarks_x = (int)(maxX[maxX_index] / 5); else if (maxX[maxX_index] <= 100) scalemarks_x = (int)(maxX[maxX_index] / 10); else if (maxX[maxX_index] <= 250) scalemarks_x = (int)(maxX[maxX_index] / 25); else if (maxX[maxX_index] <= 500) scalemarks_x = (int)(maxX[maxX_index] / 50); else if (maxX[maxX_index] <= 750) scalemarks_x = (int)(maxX[maxX_index] / 75); else scalemarks_x = (int)(maxX[maxX_index] / 100); |
Vielen Dank, an alle, die geholfen haben.
MfG Kenpachi
|
|
|