współrzędne środka okręgu
- kabanek
- 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
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ł?
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ł?
- leon1313
- 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
Może skorzystaj z wzoru (x-X0)^2 + (y-y0)^2=R^2
gdzie x, y i R to twoje dane..
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!!!"
-
- 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
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:
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).
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:
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).
- kabanek
- 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
wielkie dzięki @nwkj jakim cudem ja na to nie wpadłem..
czy o coś takiego chodziło?
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
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;
}
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
- Struchu
- 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
No bo jak liczysz to na liczbach całkowitych (zwłaszcza pierwiastek)...
Ma zielone, kocie oczy...
- kabanek
- 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
no to kod wyglądałby tak:
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
znalazłem w internecie (http://pytamy.pl/question/k-t-pomi-dzy- ... dcinkami/1) coś takiego:
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;
}
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
znalazłem w internecie (http://pytamy.pl/question/k-t-pomi-dzy- ... dcinkami/1) coś takiego:
no ale to chyba nie liczy to co chcę...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
-
- 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
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ł
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ł
- leon1313
- 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
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..kabanek pisze: i wyświetla punkt (5,5)
"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!!!"
- kabanek
- 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
o rzeczach oczywistych się podobno nie mówileon1313 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..
Kod: Zaznacz cały
|AC|/cos(90) = |DC|/cos(alpha)
|DC|=|AC|/cos(90)*cos(alpha)
cos(alpha)=|DC|*cos(90)/|AC|
- Struchu
- 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
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...
- leon1313
- 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
Może się i nie mówi, ale napisać trzebakabanek pisze:o rzeczach oczywistych się podobno nie mówi
"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!!!"
- kabanek
- 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
napisałem to i kod dla potomnych podaję:)
EDIT:
coś mi się to myli....
funkcja wygląda tak:
i dla danych:
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?
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;
}
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]);
}
zwraca mia = QPoint(52,375)
b = QPoint(346,474)
co jest jak najbardziej błędnes = QPoint(167,167)
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?
- urgo
- 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
heh, nie zna matematyki a bierze się za pisanie programów.
- kabanek
- 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
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
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
- Struchu
- 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
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...
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości