|
|
|
|
canvas, lineto und winkelfunktionen.... |
rhamirez
Neuling
Dabei seit: 15.01.2008
Beiträge: 12
|
|
canvas, lineto und winkelfunktionen.... |
|
Guten Tag, ich brauche erstmal eine logische hilfe, da ich grade eine Denkblockade habe...
ein programm soll auf einer runden skala ähnlich eines analogen messgerätes (zum beispiel ein altes Voltmeter, oder eines Tachos) einen wert darstellen, habe bis jetzt nur mit TImage und der zeichenfläche canvas mit moveto und lineto gearbeitet im unterricht....
wie bekomme ich das jetzt hin, das er mir das annährend genau zb. 3% 7% 98% auf einer derartigen fläche ausgibt, eine rein vertikale skala mit unterschiedlich langem zeiger, wäre ja kein problem....
hat einer eine idee wie man das lösen kann, habe leider grad keine idee
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von rhamirez: 25.04.2008 21:01.
|
|
25.04.2008 21:00 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Wenn du das jetzt in einem Halbkreis darstellen sollst, sind die 180° 100%.
Für alle Punkte zwischen 0-100% musst du das dann mit den Winkelfunktionen entsprechend berechnen, wo dieser Punkt im Koordinatensystem liegt.
Hast du Code den du zeigen kannst?
btw. für wxWidgets gibts das schon fertig.
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
25.04.2008 21:06 |
|
|
rhamirez
Neuling
Dabei seit: 15.01.2008
Beiträge: 12
Themenstarter
|
|
hui das ging ja schnell,
bräuchte eigentlich momentann nur die hilfe wie diese winkelfunktion aussieht....
mathematisch gesehen...
etwas fertiges kann ich leider icht gebrauchen, da ich es selber machen möchte...
|
|
25.04.2008 21:19 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
code: |
1:
2:
|
double max=10;for(double i=0;i<max;++i)plot(mx+r*cos(x),my+r*sin(x));//c++ ist ja viel besser als deutsch für sowas.
double max=10;for(double i=0;i<max;++i)plot(mx+r*cos(i*(2*PI/max)),my+r*sin(i*(2*PI/max))); mx my mittelpunkt kreis |
|
Mit den Formeln müsstest du weiter kommen. Das max müsstest du halt hochsetzen.
phlox
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
26.04.2008 13:35 |
|
|
rhamirez
Neuling
Dabei seit: 15.01.2008
Beiträge: 12
Themenstarter
|
|
hmm.. leider nicht so ganz....
könnte sich einer das programm mal anschauen und sagen wo der fehler ist, bekomme keinen wert eingelesen, und das mit den winkeln funktioniert auch noch nicht ganz so gut
Dateianhang: |
messer.zip (39,38 KB, 4 mal heruntergeladen)
|
|
|
06.05.2008 14:47 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Ich hab jetzt nicht die Zeit mir dein Projekt im Detail anzuschauen, ausserdem verwende ich keine VCL.
Du müsstest also schon die entsprechenden Programmausschnitte posten.
Die Formal die ich gepostet habe, berechnet übrigens gleichmäßige Punkte die auf einem Kreis verteilt sind. Wenn du nun nur den Zeiger bewegen musst, müsstest du mal schauen, wie du einen einzelnen Winkel davon berechnest.
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
06.05.2008 15:02 |
|
|
rhamirez
Neuling
Dabei seit: 15.01.2008
Beiträge: 12
Themenstarter
|
|
code: |
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:
|
void clMesser::zeichnen(String text)
{
Bild->Canvas->Pen->Color= clBlack;
Bild->Canvas->Rectangle(0,0,300,250);
Bild->Canvas->MoveTo(300, 200);
Bild->Canvas->LineTo(0,200);
Bild->Canvas->Ellipse(130,210,160,240);
int mx=145;//mittelpunkt
int my=220;//mittelpunkt
int r=120;//länge des zeigers
int wert = text.ToIntDef(0);
int x=wert;//winkel
Bild->Canvas->MoveTo(mx,my);
double max=1;for(double i=0;i<max;++i)
Bild->Canvas->LineTo(mx+r*cos(x),my+r*sin(x));
double max2=1;for(double i=0;i<max2;++i)
Bild->Canvas->LineTo(mx+r*cos(i*(2*M_PI/max2)),my+r*sin(i*(2*M_PI/max2)));
}
problem ist, das die schritte zu groß sind bzw der zeiger tausendmal rum geht....
|
|
|
|
06.05.2008 15:18 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Zitat: |
Original von rhamirez
code: |
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:
|
void clMesser::zeichnen(String text)
{
Bild->Canvas->Pen->Color= clBlack;
Bild->Canvas->Rectangle(0,0,300,250);
Bild->Canvas->MoveTo(300, 200);
Bild->Canvas->LineTo(0,200);
Bild->Canvas->Ellipse(130,210,160,240);
int mx=145;//mittelpunkt
int my=220;//mittelpunkt
int r=120;//länge des zeigers
int wert = text.ToIntDef(0);
int x=wert;//winkel
Bild->Canvas->MoveTo(mx,my);
double max=1;for(double i=0;i<max;++i)
Bild->Canvas->LineTo(mx+r*cos(x),my+r*sin(x));
double max2=1;for(double i=0;i<max2;++i)
Bild->Canvas->LineTo(mx+r*cos(i*(2*M_PI/max2)),my+r*sin(i*(2*M_PI/max2)));
}
|
|
problem ist, das die schritte zu groß sind bzw der zeiger tausendmal rum geht.... |
Hm, also ich seh den Sinn der Schleife da nicht, wenn du Max auf 1 setzt:
code: |
1:
2:
3:
4:
5:
6:
7:
|
//..
Bild->Canvas->MoveTo(mx,my);
double max=1;for(double i=0;i<max;++i)
Bild->Canvas->LineTo(mx+r*cos(x),my+r*sin(x));
double max2=1;for(double i=0;i<max2;++i)
Bild->Canvas->LineTo(mx+r*cos(i*(2*M_PI/max2)),my+r*sin(i*(2*M_PI/max2)));
|
|
Und wenn macht nur eine der beiden Formeln sinn. Wahrscheinlich die 2.
Wie ich im vorpost geschrieben habe, die Formel berechnet die Punkte, welche auf dem Kreis k verteilt sind. bei max = 1 kanns aber sein, das es gar nichts macht.
Setz das Max mal hoch. Auf 10 - 100. Und evtl. zeichnest du für den beginn erstmal dort nur einen Punkt, um die Verteilung zu sehen.
phlox
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
06.05.2008 15:31 |
|
|
rhamirez
Neuling
Dabei seit: 15.01.2008
Beiträge: 12
Themenstarter
|
|
dann zeichnet er mir aber einen ganzen kreis bei 100, bzw ein polygon bei 10
|
|
06.05.2008 15:38 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Zitat: |
Original von rhamirez
dann zeichnet er mir aber einen ganzen kreis bei 100, bzw ein polygon bei 10 |
Dann klappts ja. Wie ich sagte die Formel berechnet nur die Punkte die auf dem Kreis liegen. Ich denke das Polygon bei 10 ist regelmäßig
.
Jetzt musst du halt da ein wenig rechnen. Wenn du nur den Zeiger zeichnen willst, wärs sinnvoll, wenn dir die Positionen für die Gradangaben mit der Formel berechnest.
Mit 360 würdest du ja von dem Kreis jeden einzelnen Grad als Punkt erhalten.
Das dann z.B. in einen vector<pair<int,int> > vec, und du könntest den index als Gradmesser nehmen. vec[0] -> 0° vec[x] -> x°
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
06.05.2008 15:45 |
|
|
|
|
|
|