Autor Beitrag
Kenpachi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30

Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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) 11.523457.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 :nixweiss: .

_________________
>λ=


Zuletzt bearbeitet von Kha am Di 15.03.11 22:57, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Kenpachi
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30

Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Di 15.03.11 23:16 
oh, entschuldigung, die waren also options woanders:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30

Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
BeitragVerfasst: 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):
ausblenden volle Höhe C#-Quelltext
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, 11.25F, 1.5F, 1.75F, 22.25F, 2.5F, 33.5F, 44.5F, 5,
                                            5.25F, 66.75F, 7.5F, 891012.5F, 1517.5F, 2022.5F, 253035404550556065707580859095100125,
                                            1501752002252503003504004505005256006757508009001000};
            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