Einen Punkt wandern lassen (im Kreis)
Item_Sek
- programmiertechnik
Hallo Ihr lieben Web-Programmierer!
Ja, ich habe da mal ein wirklich "untypische" frage zur Mathematik.
Ich bin wirklich kein "Ass" was Mathematik angeht (ok, ein Dreisatz bekomme ich schon hin if wennEsDennSeinMuss=1) aber irgendwann muss ich es ja mal hinbekommen. Und zwar, ich möchte einen Punkt/Kreis- oder was auch immer, in einem von mir vorgebenen Radius kreisen lassen.
Das Programmiertechnische ist nicht das Problem (setze es in PureBasic um, eine mischung aus C und Basic) aber den Mathematischen teil begreife ich einfach nicht.
Ich habe die ganze sache mit Cosinus Tangens und Co. noch nie begriffen (auch nie wirklich gebraucht).
Deswegen frage ich einfach mal hier, bei den Profis: "Kann mir dass jemand begreiflich machen?" also in einem kleinen Beispiel?
Das wäre echt Super und Nett......
Hallo,
Ich habe die ganze sache mit Cosinus Tangens und Co. noch nie begriffen (auch nie wirklich gebraucht).
Also, wenn Du einen Punkt kreisen lassen willst, musst Du Dich mit Arcus-Tangens befassen. Arctan(Winkel) gibt die Positionen auf einer Kreisbahn(Durchmesser) zurück.
Das wird z.B. gebraucht zum Programmieren einer Analog-Uhr wo die Zeiger rotieren, hier kreisen die Eckpunkte des Zeigers, den Rest macht das Grafikmodul.
Viele Grüße,
Hotte
Moin!
Ich habe die ganze sache mit Cosinus Tangens und Co. noch nie begriffen (auch nie wirklich gebraucht).
Also, wenn Du einen Punkt kreisen lassen willst, musst Du Dich mit Arcus-Tangens befassen. Arctan(Winkel) gibt die Positionen auf einer Kreisbahn(Durchmesser) zurück.
Wie kommst du denn auf diese Idee? Das ist vollkommen falsch.
- Sven Rautenberg
Hallo Item_Sek,
... Und zwar, ich möchte einen Punkt/Kreis- oder was auch immer, in einem von mir vorgebenen Radius kreisen lassen.
x: X-Koordinate
y: Y-Koordinate
r: Kreisradius
x = r*cos(phi)
y = r*sin(phi)
Den Winkel phi lässt du von 0 bis 2*PI in genügend kleinen Schritten laufen.
Gruß, Jürgen
echo $begrüßung;
ich möchte einen Punkt/Kreis- oder was auch immer, in einem von mir vorgebenen Radius kreisen lassen.
Das ist ja im Prinzip auch nicht viel anders als einen Kreis zu zeichnen. Ich hab das vor vielen, vielen Monden mal so gemacht:
Ich betrachte mal nur einen viertel Kreis, der Rest ist durch Vorzeichenwechsel zu erledigen.
y
^
|***
| **
| *
| *
| *
| *
| *
| *
+--------> x
Gut, sieht hier nicht ganz wie ein Kreis aus, aber egal.
Wichtig ist aber: Du kannst jeden Punkt des Radius mit einem rechtwinkligen Dreieck erreichen.
y
^
|***
| **
|·····*
| /|*
| /α|*
| r/ | *
| / _| *
|/β (·| *
+-----+--> x
Der Radius r ist bekannt und bleibt immer gleich. Dies ist auch die Seite c im rechtwinkligen Dreieck. a ist auf der x-Achse und b auf der y-Achse. Somit liegt β (Beta) links vom rechten Winkel und α (Alpha) oben drüber.
Du beginnst mit einem beliebig kleinen Winkelwert für β und erhöhst diesen solange er kleiner als 90° ist, denn ab 90° hast du ja kein Dreieck mehr. Das dazugehörende α bekommst du durch einfache Rechnung (90° - β) raus. Von der Schrittweite ist die Präzision der Bewegung abhängig. Außerdem spielt der Radius eine Rolle. Bei größerem Radius machst du mit dem selben Schritt einen größeren Sprung.
Und nun gibt es die Formeln:
a b
sin α = --- und sin β = ---
c c
Die stellst du um und hast a = c · sin α und b = c · sin β. Damit hast du die Werte für x- und y-Achse, die du der Zeichenfunktion übergeben kannst.
echo "$verabschiedung $name";
Hello,
da habe ich auch noch was...
Malen mit PHP, HTML und CSS
http://selfhtml.bitworks.de/grafik/sinus.php
Wandern lassen geht dann wohl nur mit JavaScript
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hi,
Wandern lassen geht dann wohl nur mit JavaScript
Ich habe mal eine Analoguhr damit programmiert.
mfG,
steckl
echo $begrüßung;
da habe ich auch noch was...
Malen mit PHP, HTML und CSS
http://selfhtml.bitworks.de/grafik/sinus.php
Aus deinem Beispiel schließe ich, dass du einen etwas anderen Lösungsansatz gewählt hast. Du erhöhst nicht den Winkel sondern den x-Wert und errechnest daraus den zugehörigen y-Wert. Das hat zur Folge, dass bei steilen Passagen Punkte fehlen, da zu diesen x-Werten aufgrund des Pixelrasters mehrere y-Werte existieren. Eine Lösung wäre, nur einen achtel Kreis zu berechnen. Den Rest zum Viertelkreis erhält man durch Gegeneinanderaustauschen von x und y. Das kann man dann auch irgendwie nur mit den 4 Grundrechenarten berechnen, braucht also keine Winkelfunktionen dafür. Eigentlich wollte ich zuerst diesen Ansatz erläutern, aber zum einen habe ich vergessen wie das ging, zum anderen sind Winkelfunktionen heutzutage in den zu Programmsprachen mitgelieferten Bibliotheken enthalten. Der Achtelkreis ist übrigens dann vollständig, wenn der x-Wert größer als der errechnete y-Wert geworden ist. Man muss also nicht noch den Winkel berechnen, um zu sehen, ob der 45° erreicht hat.
echo "$verabschiedung $name";
Hello,
Malen mit PHP, HTML und CSS
http://selfhtml.bitworks.de/grafik/sinus.phpAus deinem Beispiel schließe ich, dass du einen etwas anderen Lösungsansatz gewählt hast. Du erhöhst nicht den Winkel sondern den x-Wert und errechnest daraus den zugehörigen y-Wert.
ja.
Ich poste einfach mal das grausige Script...
<?php ### sinus.php ###
function make_point($x,$y,$class)
{
$point = "<span class="$class" style="".
"Top:".round($y)."px; Left:".round($x)."px;"></span>\n";
return $point;
}
#------------------------------------------------------------------------------
$curve = '';
$y = 0;
for ($x = (float)0; $x < 720; $x+=1.0 )
{
$y_neu = round((sin(deg2rad($x))*150)+200);
#if ($y_neu != $y)
{
$curve .= make_point($x, $y_neu,'sinus');
}
#$y = $y_neu;
}
$line = '';
for ($x = (float)0; $x < 720; $x+=2.0 )
{
$line .= make_point($x, 200, 'line');
}
$circle = '';
$r = 100.0;
$r2 = $r*$r;
for ($x = -$r; $x <= $r; $x++)
{
$x2 = $x*$x;
$circle .= make_point($x + 100, 200.0 + sqrt($r2 - $x2), 'kreis');
$circle .= make_point($x + 100, 200.0 - sqrt($r2 - $x2), 'kreis');
}
###############################################################################
###############################################################################
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Sinus-Kurve</TITLE>
<style type="text/css">
<!--
.sinus
{
position:absolute;
font-size:1px;
width:1px;
height:1px;
background-color:red;
}
.kreis
{
position:absolute;
font-size:1px;
width:1px;
height:1px;
background-color:blue;
}
.line
{
position:absolute;
font-size:1px;
width:1px;
height:1px;
background-color:black;
}
-->
</style>
</HEAD>
<BODY>
<?php echo "\n".$curve; ?>
<?php echo "\n".$line; ?>
<?php echo "\n".$circle; ?>
</BODY>
</HTML>
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hallo,
ihr solltet euch mal http://de.wikipedia.org/wiki/Kreis_(Geometrie) und da speziell den Punkt "Parameterdarstellung" ansehen.
Gruß, Jürgen
Tach.
Das kann man dann auch irgendwie nur mit den 4 Grundrechenarten berechnen, braucht also keine Winkelfunktionen dafür. Eigentlich wollte ich zuerst diesen Ansatz erläutern, aber zum einen habe ich vergessen wie das ging ...
Meinst Du den Bresenham-Algorithmus?
echo $begrüßung;
Das kann man dann auch irgendwie nur mit den 4 Grundrechenarten berechnen, braucht also keine Winkelfunktionen dafür. Eigentlich wollte ich zuerst diesen Ansatz erläutern, aber zum einen habe ich vergessen wie das ging ...
Meinst Du den Bresenham-Algorithmus?
Nein, diese Methode meinte ich nicht. Die sieht recht einfach aus, aber ich kannte sie damals nicht, als ich das mal brauchte. Ich denke, ich hatte einfach nur die üblichen bekannten Funktionen im rechtwinkligen Dreieck passend umgestellt und verwendet. Die Lösung erstellte ich mit Z80-kompatiblen Assemblercode. Der kannte nur Addition und Subtraktion. Codestücke für Multiplikation und Division fand ich in irgend einem Buch. (Internet? gabs damals nicht.)
echo "$verabschiedung $name";
Hallo,
ich danke euch allen für eure Mühe!
Ich glaube ich habe es begriffen anhand der Hilfreichen Threads!
Wünsche euch eine schöne Woche!
Hellihello Item_Sek,
ein paar Spielereien dazu, inklusive Punktwanderungen im Kreis.
Gruß,
frankx
Hi frankx,
yes, danke, sehr nett^^ !