|
Autor |
Nachricht |
Sevensworld
Forenbesetzer
Alter: 54
Anmeldung: 21.03.2005
Beiträge: 418
|
|
Wir haben in der Fortbildung das Fach Softwareentwicklung und Handhabung. Grundlage ist C/C++ und als Programm nutzen wir TCLite.
Ich stehe momentan vor dem Problem eine Linie in Abhängigkeit von einem Winkel zeichnen zu wollen und/oder einen Kreis/Kreisbogen zu beschriften(eine Skala wäre auch nicht schlecht).
Ich kann zwar Linien ziehen mit Angabe von Start und Endpunktpunkt, oder Tortenstücke mit Angabe von Winkel und Radius usw., aber eine Linie mit bestimmter Länge von einem Punkt in einem bestimmten Winkel bekomme ich nicht hin, geht das überhaupt??
Der Versuch ist eine Art Manometer(logischerweise rund!) grafisch darzustellen, in dem eine Skala zu sehen ist und je nachdem was für Werte rein kommen, sich dann auch ein Zeiger bewegt. Das "Gehäuse" und die Grobe Skala(ziemlich aufwändig) bekomme ich ja noch hin, aber bei dem Zeiger weiß ich nicht weiter. Wobei das größte Problem erst mal wäre dem Zeiger manuell darzustellen. Die Überlegung war den Mittelpunkt zu nehmen und dann eine Linie in einem bestimmten Winkel und Länge vom Mittelpunkt aus zu zeichnen ... nur wie?
Über einen Tip wäre ich echt dankbar.
Gruß
Jens
|
|
|
|
|
|
|
|
|
Fabse
Stammposter
Anmeldung: 30.01.2005
Beiträge: 337
|
|
also generell sollte dir der tangens hier was bringen. ich bastel mal was
|
|
|
|
|
|
|
|
Fabse
Stammposter
Anmeldung: 30.01.2005
Beiträge: 337
|
|
So also der relevante Teil ist folgender:
Code:
|
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.Clear(Color.White);
int px = this.Size.Width / 2;
int py = this.Size.Height / 2;
int dx = (int)(radius * Math.Sin(winkel * (Math.PI / 180)));
int dy = (int)(radius * Math.Cos(winkel * (Math.PI / 180)));
g.DrawLine(Pens.Black, px, py, px + dx, py + dy);
g.DrawArc(Pens.Gray, px - radius, py - radius, 2 * radius, 2 * radius, 0, 360);
}
|
^^das ist C#-Code, aber du solltest trotzdem lesen können, was der macht.
solltest du das proggie angucken wollen, dann benötigst du ein installiertes .net 2.0 framework
|
|
|
|
|
|
|
|
Sevensworld
Forenbesetzer
Alter: 54
Anmeldung: 21.03.2005
Beiträge: 418
|
|
Naja, C ist schon ok, denn der Compiler macht wohl eh nur reines C . Das Problem ist aber das ich NUR mit TCLIte arbeiten kann! Also werde ich auch nix mit dem Framework anfangen können ...
Außerdem hilft mir doch der Tangens nicht weiter, da ich nur die Länge von c habe und nicht von a oder b !
|
|
|
|
|
|
|
|
Fabse
Stammposter
Anmeldung: 30.01.2005
Beiträge: 337
|
|
also wenn du mit meinem geposteten code wirklich nichts anfangen kannst, dann tut es mir leid, dann solltest du deinen gewählten ausbildungsgang überdenken!
|
|
|
|
|
|
|
|
Sevensworld
Forenbesetzer
Alter: 54
Anmeldung: 21.03.2005
Beiträge: 418
|
|
Ja sorry, aber deine Art den Code darzustellen entspricht nun mal nicht den Gepflogenheiten unserer Lehrer. So grob weiß ich was da passiert, schön wären aber noch ein paar Kommentare zu den einzelnen Zeilen.
Außerdem kommt unser Programm scheinbar nicht mit deinem Code klar.
Das wäre mein bisheriger Ansatz.
In den Kreis brauche ich dann den Zeiger ...
Code:
|
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
int x,y; /* Initialisierung */
struct arccoordstype info1;
struct arccoordstype info2;
struct arccoordstype info3;
struct arccoordstype info4;
main()
{
int treiber,modus;
treiber=DETECT;
initgraph(&treiber,&modus,""); /* Grafik einstellen */
setbkcolor(BLACK); /* Hintergrundfarbe */
x=(getmaxx()+1)/2;
y=(getmaxy()+1)/2; /* x&y Bildmitte */
setcolor(8);
circle(x,y,150); /* Kreis zeichnen */
floodfill(x+20,y+20,8);
arc(x,y,315,45,110); /* kl. Kreisbogen zeichnen 1/3 */
getarccoords(&info1);
arc(x,y,315,45,130); /* gr. Kreisbogen zeichnen 1/3 */
getarccoords(&info2);
arc(x,y,135,225,110); /* kl. Kreisbogen zeichnen 3/3 */
getarccoords(&info3);
arc(x,y,135,225,130); /* gr. Kreisbogen zeichnen 3/3 */
getarccoords(&info4);
arc(x,y,45,135,110); /* kl. Kreisbogen zeichnen 2/3 */
arc(x,y,45,135,130); /* kl. Kreisbogen zeichnen 2/3 */
line(info1.xstart,info1.ystart,info2.xstart,info2.ystart);
line(info1.xend,info1.yend,info2.xend,info2.yend);
line(info3.xstart,info3.ystart,info4.xstart,info4.ystart);
line(info3.xend,info3.yend,info4.xend,info4.yend);
setfillstyle(1,GREEN);
floodfill(x,y-120,8);
setfillstyle(1,YELLOW);
floodfill(x-120,y,8);
setfillstyle(1,RED);
floodfill(x+120,y,8);
setfillstyle(1,8); /* F?llmuster + farbe festlegen */
sector(x,y,0,360,5,5); /* Sektor zeichen und f?llen ACHTUNG FEHLER IM DER SPRACHBESCHREIBUNG */
getch();
closegraph();
}
|
|
|
|
|
|
|
|
|
|
Fabse
Stammposter
Anmeldung: 30.01.2005
Beiträge: 337
|
|
a) ich mache nicht deine hausaufgaben
b) ich habe dir bereits nur den relevanten teil rausgesucht
c) dein programm kommt natürlich nicht mit klar, weil ich eine andere sprache genutzt habe
ich hab einmal den sinus und einmal den cosinus genutzt, das sieht man selbst, wenn man von c# keine ahnung hat.
|
|
|
|
|
|
|
|
Sevensworld
Forenbesetzer
Alter: 54
Anmeldung: 21.03.2005
Beiträge: 418
|
|
1. hast du recht, ich habe wohl nicht richtig hingesehen was sinus bzw. cosinus an geht
2. ist das keine Hausaufgabe, sondern etwas eigenes um ein wenig mehr zu verstehen, als das was uns im Unterricht gezeigt wurde.
3. bringt mir dein Ansatz nix, wenn ich nicht verstehe wie die Sache funktioniert.
Ich bin bisher davon ausgegangen, das ich je nach dem in welchem Quadranten ich mich befinde neu berechnen muß. Die einfachsten Werte darzustellen wären die bei 0°,90° und 180°. Nach deiner Formel zu urteilen müßte es aber machbar sein von einem Nullpunkt auszugehen ... unabhängig davon in welchem Quadrant ich mich befinde.
Falls du allerdings weiterhin meinst den Oberlehrer raus hängen lassen zu müssen, dann spar dir lieber weitere Antworten. Ich habe schließlich freundlich gefragt ob mir jemand helfen mag und nicht gesagt: Ich habe hier eine Hausaufgabe, könnt ihr mir die lösen, weil ich bin zu faul dazu!
Um es noch mal zu verdeutlichen .. die Grafikbefehle sind sehr sparsam in unserer Sprachbeschreibung dargestellt und erst recht nicht vollständig. Wenn du meinst das ich keine Ahnung habe, bitte ... da magst du recht haben .. zumindest wenn du mich mit dir vergleichst! Aber ich bin immerhin bereit dazu zu lernen, nur helfen da blöde Sprüche nicht wirklich weiter!
|
|
|
|
|
|
|
|
Fabse
Stammposter
Anmeldung: 30.01.2005
Beiträge: 337
|
|
kein problem, ich hatte halt einfach das gefühl, dass du einmal copy&paste gemacht hast, es nicht ging und dann war es das. man muss sich mit seinem problem halt auseinandersetzen.
So hier nochmal die theorie, die dahinter steckt.
a = alpha = Der Winkel, den deine gerade haben sollte (bekannt)
r = radius = Länge der Gerade (bekannt)
x = x-Koordinate des zweiten punkts
y = y-koord...
In dem Modell liegt der eine Punkt der gerade im ursprung bei (0/0) und der zweite bei den errechneten (x/y).
Aus der Zeichnung wird deutlich, dass man sich ein rechtwinkliges dreieck denken kann.
Hier setzt man jetzt mal den sinus und cosinus an:
sinus(alpha) = Gegenkathete/Hypotenuse = y/r
und
cosinus(alpha) = Ankathete/Hypotenuse = x/r
die gleichungen kannst du jetzt jeweils nach y bzw x umstellen und erhältst dann bei einsetzen von r und alpha deinen zweiten punkt für deine Linie!
Nun alles klar?
http://de.wikipedia.org/wiki/Sinus
|
|
|
|
|
|
|
|
Sevensworld
Forenbesetzer
Alter: 54
Anmeldung: 21.03.2005
Beiträge: 418
|
|
Danke dir noch mal dafür! Habe es jetzt zwar ein klein wenig anderes gelöst, aber vom Prinzip her klappt es genau so wie es soll
Allerdings habe ich da noch eine weitere Frage:
Nach dem mein kleines Anzeigeinstrument jetzt zumindest schon mal ein klein wenig funktioniert , wollte ich den Wert auch digital darstellen, also als Zahl. Das Problem ist nur das im Grafikmodus (graphics.h = dos) keine Ausgabe von Zahlen möglich ist. Das würde bedeuten das ich den Zahlenwert mit dem ich rechne irgendwie so umwandeln muß, das er trotzdem darstellbar ist. Wie mache ich so etwas? Mit welcher Funktionist so etwas möglich?
Gruß
Seven
|
|
|
|
|
|
|
|
Fabse
Stammposter
Anmeldung: 30.01.2005
Beiträge: 337
|
|
kann ich dir nicht wirklich helfen. was vielleicht geht, ist die zahl in eine string umwandeln und den über einen ausgabebefehl wohin schreiben. mehr kann ich jetzt so recht nicht sagen dazu.
|
|
|
|
|
|
|
|
|
Sevensworld
Forenbesetzer
Alter: 54
Anmeldung: 21.03.2005
Beiträge: 418
|
|
Ja danke, das Umwandeln von der Zahl in einen String war die Lösung. Ich hatte nur Schwierigkeiten mit der Überprüfung, da es hier im Büro komischerweise nicht geklappt hat(Darstellungsfehler), zu Hause auf dem Laptop war jedoch mit der Darstellung dann alles in Ordnung.
Zur Ausgabe im Grafikmodus nimmt man dann den Befehl outtext(*text) oder outtextxy(x,y,*text) [dafür wird die graphics.h gebraucht] und zum Umwandeln den Befehl itoa(zahl,*string,Basis) [stdlib.h].
Gruß
Seven
|
|
|
|
|
|
|
|
|
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten Du kannst Dateien in diesem Forum nicht herunterladen
|
|
|