Strona 1 z 1
współrzędne środka okręgu
: 10 mar 2010, 20:01
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ł?
Odp: współrzędne środka okręgu
: 10 mar 2010, 23:57
autor: leon1313
Może skorzystaj z wzoru (x-X0)^2 + (y-y0)^2=R^2
gdzie x, y i R to twoje dane..
Odp: współrzędne środka okręgu
: 11 mar 2010, 01:04
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:
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).
Odp: współrzędne środka okręgu
: 13 mar 2010, 10:11
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
Odp: współrzędne środka okręgu
: 13 mar 2010, 12:52
autor: Struchu
No bo jak liczysz to na liczbach całkowitych (zwłaszcza pierwiastek)...
Odp: współrzędne środka okręgu
: 13 mar 2010, 17:30
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

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ę...
Odp: współrzędne środka okręgu
: 14 mar 2010, 12:09
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ł

Odp: współrzędne środka okręgu
: 14 mar 2010, 21:09
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..
Odp: współrzędne środka okręgu
: 15 mar 2010, 21:08
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?
Odp: współrzędne środka okręgu
: 15 mar 2010, 22:07
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
Odp: współrzędne środka okręgu
: 16 mar 2010, 01:55
autor: leon1313
kabanek pisze:o rzeczach oczywistych się podobno nie mówi
Może się i nie mówi, ale napisać trzeba

Odp: współrzędne środka okręgu
: 20 mar 2010, 20:16
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?
Odp: współrzędne środka okręgu
: 20 mar 2010, 22:46
autor: urgo
heh, nie zna matematyki a bierze się za pisanie programów.
Odp: współrzędne środka okręgu
: 21 mar 2010, 20:32
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
Odp: współrzędne środka okręgu
: 21 mar 2010, 23:07
autor: Struchu
Ale kombinujesz - żeby policzyć środek odcinka wystarczy dodać współrzędne końców tego odcinka i podzielić je przez 2...