|
| Sikkert et simpelt mat spørgsmål Fra : Flare |
Dato : 22-05-04 11:59 |
|
Hejsa. Jeg ved ikke om det er den rigtige gruppe ellers må i lige FUT´e mig.
(Problemet er releateret til en problem i et simpelt CAD program jeg er ved
at lave hvor jeg skal tvinge linie tegning til at være vinkelret)
Lad os antage at vi har et givet punkt (x,y) [origo] og et andet punkt
(x1,y1).
Hvordan beregner jeg vinkelen (FI) som denne linie danner med den fiktive
xakse som (x,y) danner? Jeg er rimlig sikker på at jeg skal antage at jeg
har en enhedscirkel med midtpunkt i (X,y) og lave noget sin,cos ift. til den
nye koordinat.
Jeg kan bare ikke lige greje det. Nogen af jer der kan diske op med en
(sikkert simpel formel)
grader (deg/rad) = en beregning på baggrund af x,y,x1,y1
Takker mange gange på forhånd
Anders
| |
Jens Axel Søgaard (22-05-2004)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 22-05-04 12:36 |
|
Flare wrote:
> Lad os antage at vi har et givet punkt (x,y) [origo] og et andet punkt
> (x1,y1).
> Hvordan beregner jeg vinkelen (FI) som denne linie danner med den fiktive
> xakse som (x,y) danner? Jeg er rimlig sikker på at jeg skal antage at jeg
> har en enhedscirkel med midtpunkt i (X,y) og lave noget sin,cos ift. til den
> nye koordinat.
>
> Jeg kan bare ikke lige greje det. Nogen af jer der kan diske op med en
> (sikkert simpel formel)
>
> grader (deg/rad) = en beregning på baggrund af x,y,x1,y1
B
/|
/ |
/ |
c / | a=c*sin(A)
/ |
/ |
-------
A b=c*cos(A)
På baggrund a x,y,x1 og y1 kan du udregne længderne a og b.
Problemet er nu at bestemme vinklen A. Fidusen er at dividere
de to:
a c * sin(A)
--- = ------------ = tan (A)
b c * cos(A)
Det betyder, at du kan udregne A ved at benytte den omvendte
function af tangens.
-1 a
A = tan ( --- )
b
Den hedder sandsynligvis atan eller arctan i dit programmeringssprog.
> (Problemet er releateret til en problem i et simpelt CAD program jeg er ved
> at lave hvor jeg skal tvinge linie tegning til at være vinkelret)
Hvis du har en linje med retningsvektor (u,v) [m.a.o. når man går u
hen går man v op] så er en af retningsvektorene for linjen vinkelret på (u,-v).
--
Jens Axel Søgaard
| |
Flare (22-05-2004)
| Kommentar Fra : Flare |
Dato : 22-05-04 13:15 |
|
> -1 a
> A = tan ( --- )
> b
Det vil vel ikke virke hele vejen "rundt".
(x1,y1)
/
/
/
(x,y)----------------------
\
\
\
\(x1,y)
I de 2 situationer får jeg jo samme (A) da a og b er jo er ens. Eller hvad?
Mvh
Anders
| |
Jens Axel Søgaard (22-05-2004)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 22-05-04 13:38 |
|
Flare wrote:
>> -1 a
>> A = tan ( --- )
>> b
>
>
> Det vil vel ikke virke hele vejen "rundt".
> (x1,y1)
> /
> /
> /
> (x,y)----------------------
> \
> \
> \
> \(x1,y)
>
> I de 2 situationer får jeg jo samme (A) da a og b er jo er ens.
> Eller hvad?
Du skal bare regne y-forskellen med fortegn.
Tallet tan(A) er positivt, hvis linjen går opad,
og negativ, hvis den går nedad.
tan( 2/3) = 0.588 radianer
tan(-2/3) = -0.588 radianer
Det eneste tilfælde, hvor metoden ikke virker,
er når linjen er lodret.
--
Jens Axel Søgaard
| |
Jakob Blaavand (22-05-2004)
| Kommentar Fra : Jakob Blaavand |
Dato : 22-05-04 13:54 |
|
On Sat, 22 May 2004 14:37:48 +0200, Jens Axel Søgaard
<usenet@soegaard.net> wrote:
>Flare wrote:
>Det eneste tilfælde, hvor metoden ikke virker,
>er når linjen er lodret.
Men det er jo også rimelig simpelt at kompensere for - man tjekker
blot om x=0 fra starten... hvis den er det, så er det så fortegnet for
y der afgør om vinklen er pi/2 eller -pi/2
/Jakob Blaavand
| |
Jens Axel Søgaard (22-05-2004)
| Kommentar Fra : Jens Axel Søgaard |
Dato : 22-05-04 14:09 |
|
Jens Axel Søgaard wrote:
> Det eneste tilfælde, hvor metoden ikke virker,
> er når linjen er lodret.
Uh. Jeg vrøvler. Metoden finder den spidse vinkel
mellem linjen og vandret.
--
Jens Axel Søgaard
| |
Aage Andersen (22-05-2004)
| Kommentar Fra : Aage Andersen |
Dato : 22-05-04 14:59 |
|
"Flare" <nomail@sorry.dk> skrev i en meddelelse
news:40af3257$0$437$edfadb0f@dread14.news.tele.dk...
> Hejsa. Jeg ved ikke om det er den rigtige gruppe ellers må i lige FUT´e
mig.
>
> (Problemet er releateret til en problem i et simpelt CAD program jeg er
ved
> at lave hvor jeg skal tvinge linie tegning til at være vinkelret)
>
>
> Lad os antage at vi har et givet punkt (x,y) [origo] og et andet punkt
> (x1,y1).
>
> Hvordan beregner jeg vinkelen (FI) som denne linie danner med den fiktive
> xakse som (x,y) danner? Jeg er rimlig sikker på at jeg skal antage at jeg
> har en enhedscirkel med midtpunkt i (X,y) og lave noget sin,cos ift. til
den
> nye koordinat.
>
> Jeg kan bare ikke lige greje det. Nogen af jer der kan diske op med en
> (sikkert simpel formel)
>
> grader (deg/rad) = en beregning på baggrund af x,y,x1,y1
>
> Takker mange gange på forhånd
> Anders
>
>
Hvis du programmere i C eller C++ har du funktionen atan2(y, x). Den går
hele vejen rundt.
Din udregning bliver derfor:
grader = (180 / pi) * atan2(y1 - y, x1 - x)
bemærk at y kommer før x og atan2 giver vinklen i radianer, som omregnes til
grader idet
pi radianer = 180 grader.
Funktionen findes også i andre sprog. Såvidt jeg ved er den fast indbygget i
computerens CPU, så den er også simpel at bruge i assembler
Aage
| |
Flare (22-05-2004)
| Kommentar Fra : Flare |
Dato : 22-05-04 15:09 |
|
Efter at have spist frokost begyndte min hjerne igen at virke og jeg kom
frem til følgende (Som virker glimrende)
float a = (Y1 - Y) / (X1 - X);
if(a < 1)
{ // Lav linie vandret }
else
{ // Lav linie lodret}
Det må også beregningsmæssigt være lidt lettere end at skulle lave sin /
cos...
Anders
| |
Jonas Møller Larsen (23-05-2004)
| Kommentar Fra : Jonas Møller Larsen |
Dato : 23-05-04 12:40 |
|
Flare wrote:
> Efter at have spist frokost begyndte min hjerne igen at virke og jeg kom
> frem til følgende (Som virker glimrende)
>
> float a = (Y1 - Y) / (X1 - X);
> if(a < 1)
> { // Lav linie vandret }
> else
> { // Lav linie lodret}
Kan du udelukke, at a (også kendt som linjens hældningskoefficient) kan
være negativ? Hvis ikke, ville jeg overveje at erstatte (a < 1) med
(abs(a) < 1) - afhængigt af hvad du prøver at opnå selvfølgelig.
--
Jonas Møller Larsen
| |
Anders Lund (23-05-2004)
| Kommentar Fra : Anders Lund |
Dato : 23-05-04 18:34 |
|
"Flare" <nomail@sorry.dk> skrev i en meddelelse
news:40af5f0f$0$484$edfadb0f@dread14.news.tele.dk...
> Efter at have spist frokost begyndte min hjerne igen at virke og jeg kom
> frem til følgende (Som virker glimrende)
>
> float a = (Y1 - Y) / (X1 - X);
Husk at tjeke for X1=X, da det vil resultere i at du dividere med 0 og så
vil programmet fejle.
Mvh
Anders Lund
| |
|
|