współrzędne środka okręgu

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

współrzędne środka okręgu

Post autor: kabanek »

może dla niektórych to wydaje się być proste, ale ja na rozwiązanie nie wpadłem....

otóż mam dwa punkty (A,B) na płaszczyźnie oraz długość promienia okręgu (R). Mam wyznaczyć współrzędne środka okręgu, do którego należą te dwa punkty.
Na kartce to obliczyć to no problem, tylko nie wiem jak to prosto zrobić w c++. Zacząłem obliczać środek odcinka AB. Potem obliczać prostą prostopadłą przechodzącą przez ten środek i chciałem jakoś przesunąć ten środek po tej prostej tak, żeby oddalony został dokładnie o R.

Wiem, że to jest trochę na około i na pewno to można obliczyć szybciej nie kombinując znacząco kodu, ale nic mi nie przychodzi do głowy.

Macie może jakiś pomysł?
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: współrzędne środka okręgu

Post autor: leon1313 »

Może skorzystaj z wzoru (x-X0)^2 + (y-y0)^2=R^2
gdzie x, y i R to twoje dane..
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
nwkj
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 08 sie 2009, 14:53
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma

Odp: współrzędne środka okręgu

Post autor: nwkj »

Szukamy środka okręgu.
Połącz 2 punkty leżące na okręgu, dostaniesz odcinek. Wiesz, że środek okręgu z tymi punktami tworzy trójkąt równoramienny o ramionach długości R.

Opuszczając wysokość z tego trójkąta lądujesz w punkcje D = 1/2 * (A + B), z tw. Pitagorasa jesteś w stanie policzyć ową wysokość wynosi ona h = sqrt( sqr(R) - sqr( |AB| / 2)) itd...

Trochę bardziej konkretnie:

Niech AB będzie wektorem [x_1, x_2] := [x_B - x_A, y_B - y_A], wektor do niego prostopadły to np v = [x_2, -x_1], normalizujemy wektor v, w := v / |v| = [x_2, -x_1] / sqrt(sqr(x_1) + sqr(x_2)).

Rysunek poglądowy:
Obrazek

Chcemy dołożyć wektor prostopadły do AB o długości h w punkcie d, co wyznaczy nam środek okręgu. Mamy więc środek := D + h * w.


Powinno się dać bez problemu zaklepać jako f(punktA, punktB, R).
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: współrzędne środka okręgu

Post autor: kabanek »

wielkie dzięki @nwkj :) jakim cudem ja na to nie wpadłem.. :)

czy o coś takiego chodziło?

Kod: Zaznacz cały

#include <math.h>
#include <QPoint>
#include <iostream>
using namespace std;

QPoint srodek(QPoint a, QPoint b, int r)
{
    int ab[] = {b.x() - a.x(), b.y() - a.y()};

    QPoint d((a.x()+b.x())/2, (a.y()+b.y())/2);

    int v[] = {ab[1], -ab[0]};
    int dl = sqrt(v[0]*v[0] + v[1]*v[1]);

    QPoint W;
    W.setX(v[0]/dl);
    W.setY(v[1]/dl);

    QPoint srodek;
    srodek.setX(W.x()*r+d.x());
    srodek.setY(W.y()*r+d.y());
    return srodek;
}

int main()
{
    QPoint p = srodek(QPoint(2, 6), QPoint(4, 8), 3);
    cout<<p.x()<<" "<<p.y()<<endl;
    return 0;
}
program znajduje punkt dla tych danych (6,4)
narysowałem sobie to na kartce i mi wyszło, że miał wyjść punkt (5,5) (tak w przybliżeniu, bo chyba nie dokładnie narysowałem rysunek, ale nie aż tak niedokładnie, żeby był taki duży błąd)

EDIT:
chyba, że gdzieś się pomyliłem, albo źle zrozumiałem
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: współrzędne środka okręgu

Post autor: Struchu »

No bo jak liczysz to na liczbach całkowitych (zwłaszcza pierwiastek)...
Ma zielone, kocie oczy...
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: współrzędne środka okręgu

Post autor: kabanek »

no to kod wyglądałby tak:

Kod: Zaznacz cały

#include <math.h>
#include <QPoint>
#include <iostream>
using namespace std;

QPoint srodek(QPoint a, QPoint b, int r)
{
    float ab[] = {b.x() - a.x(), b.y() - a.y()};

    float d[] = {(a.x()+b.x())/2, (a.y()+b.y())/2};

    float v[] = {ab[1], -ab[0]};
    float dl = sqrt(v[0]*v[0] + v[1]*v[1]);

    float w[] = {v[0]/dl, v[1]/dl};

    return QPoint(w[0]*r+d[0], w[0]*r+d[0]);
}

int main()
{
    QPoint p = srodek(QPoint(2, 6), QPoint(4, 8), 3);
    cout<<p.x()<<" "<<p.y()<<endl;
    return 0;
}
i wyświetla punkt (5,5) :)
obliczenia będą na większych liczbach więc te końcowe zaokrąglenie może być dopuszczalne.

Mam jeszcze trochę inny problem. Na poniższym obrazku (który pozwoliłem sobie edytować) zaznaczyłem kąt, który pasuje mi obliczyć, a też nie mam pomysłu jak
Obrazek
znalazłem w internecie (http://pytamy.pl/question/k-t-pomi-dzy- ... dcinkami/1) coś takiego:
Dane: odcinki: A, B, C

Oznaczenia kąty: alfa, beta, gamma ^ - potęga

Zgodnie z tw. cosinusów: c^2 = a^2+b^2 - 2ab cos(alfa)

Po przekształceniach:

cos(alfa) = (a^2+b^2-c^2)/(2ab) alfa = arccos ( (a^2+b^2-c^2)/(2ab) )
punkty: A, B, C odcinki: a =|BC|, b = |AC|, c = |AB|

długość odcinka c wyliczysz z tw. pitagorasa.

Zał.: punkt C to punkt wspólny
no ale to chyba nie liczy to co chcę...
nwkj
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 08 sie 2009, 14:53
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma

Odp: współrzędne środka okręgu

Post autor: nwkj »

Masz trójkąt prostokątny ADC, masz tw. sinusów: |AC|/sin(90) = |DC|/sin(alpha)

Wszystkie dane poza alpha powinieneś mieć.

-----------
@Struchu - mój błąd... jak nazwa wskazuje: Tw. sinusów, cos to mi się tam chyba przez patrzenie na posta wyżej zaplątał :)
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: współrzędne środka okręgu

Post autor: leon1313 »

kabanek pisze: i wyświetla punkt (5,5) :)
Tylko, że to połowa rozwiązania :-). Mnie zawsze uczyli, że można zbudować 2 takie okręgi, ale pewnie szkoła miała jakiś inny program..
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: współrzędne środka okręgu

Post autor: kabanek »

leon1313 pisze:Tylko, że to połowa rozwiązania :-). Mnie zawsze uczyli, że można zbudować 2 takie okręgi, ale pewnie szkoła miała jakiś inny program..
o rzeczach oczywistych się podobno nie mówi :)

Kod: Zaznacz cały

|AC|/cos(90) = |DC|/cos(alpha)

|DC|=|AC|/cos(90)*cos(alpha)
cos(alpha)=|DC|*cos(90)/|AC|
czyli jak z tego wyłuskać alpha?
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: współrzędne środka okręgu

Post autor: Struchu »

Można zastosować funkcję odwrotną do cos, czyli arccos. Poza tym mnie uczyli, że twierdzenie sinusów wygląda troszkę inaczej: http://pl.wikipedia.org/wiki/Twierdzenie_sinus%C3%B3w
Ma zielone, kocie oczy...
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: współrzędne środka okręgu

Post autor: leon1313 »

kabanek pisze:o rzeczach oczywistych się podobno nie mówi :)
Może się i nie mówi, ale napisać trzeba :-)
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: współrzędne środka okręgu

Post autor: kabanek »

napisałem to i kod dla potomnych podaję:)

Kod: Zaznacz cały

//funkcja liczy kąt pomiędzy bokami ab i bc, gdzie b to punkt wspólny
double kat(QPoint a, QPoint b, QPoint c)
{
    float ab = sqrt((b.x() - a.x())*(b.x() - a.x()) + (b.y() - a.y())*(b.y() - a.y()));
    float bc = sqrt((c.x() - b.x())*(c.x() - b.x()) + (c.y() - b.y())*(c.y() - b.y()));
    float ca = sqrt((a.x() - c.x())*(a.x() - c.x()) + (a.y() - c.y())*(a.y() - c.y()));

    return acos((ab*ab+bc*bc-ca*ca)/(2*ab*bc))*180/M_PI;
}
EDIT:
coś mi się to myli....

funkcja wygląda tak:

Kod: Zaznacz cały

QPoint srodek(QPoint a, QPoint b, int r)
{
    float ab[] = {b.x() - a.x(), b.y() - a.y()};

    //środek odcinka
    float d[] = {(a.x()+b.x())/2, (a.y()+b.y())/2};

    float v[] = {ab[1], -ab[0]};
    float dl = sqrt(sqr(v[0]) + sqr(v[1]));

    float w[] = {v[0]/dl, v[1]/dl};

    return QPoint(w[0]*r+d[0], w[0]*r+d[0]);
}
i dla danych:
a = QPoint(52,375)
b = QPoint(346,474)
zwraca mi
s = QPoint(167,167)
co jest jak najbardziej błędne
zaznaczyłem te punkty na osi i oczywiście, że ten punkt s nie jest środkiem okręgu
czyżbym popełnił gdzieś błąd?
Awatar użytkownika
urgo
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 09 wrz 2007, 20:37
Płeć: Mężczyzna
Wersja Ubuntu: 16.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: współrzędne środka okręgu

Post autor: urgo »

heh, nie zna matematyki a bierze się za pisanie programów.
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: współrzędne środka okręgu

Post autor: kabanek »

wiem, że coś naknociłem i zapewne nie brakuje mi dużo, żeby to zrobić a mi to jest bardzo potrzebne
nawet w matlabie napisałem funkcję, która to liczy i zwraca mi te same wyniki, więc albo ja źle zrozumiałem, albo w powyższym rozumowaniu wdarł się jakiś błąd
Awatar użytkownika
Struchu
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 116
Rejestracja: 23 mar 2008, 19:58
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: współrzędne środka okręgu

Post autor: Struchu »

Ale kombinujesz - żeby policzyć środek odcinka wystarczy dodać współrzędne końców tego odcinka i podzielić je przez 2...
Ma zielone, kocie oczy...
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości