FUNKCJA WYZNACZAJACA PUNKTY SYMETRYCZNE

FUNKCJA WYZNACZAJACA PUNKTY SYMETRYCZNE
P1
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • Postów:12
0

Napisz funkcję, która jako argumenty przyjmuje współrzędne punktu na płaszczyźnie x
oraz y (dwa argumenty typu double) oraz współczynniki funkcji liniowej (y=ax+b) a
oraz b (dwa argumenty typu double). Funkcja ma zmienić współrzędne punktu na jego
odbicie symetryczne względem prostej zdefiniowanej przez współczynniki a oraz b
(funkcja nic nie zwraca). W funkcji main wprowadź współrzędne punktu oraz
współczynniki funkcji liniowej, wywołaj funkcję i wypisz na ekranie współrzędne
nowego punktu

Kopiuj

nclude <iostream>

using namespace std;

void symetria(double& x, double& y, double a, double b)
{   double c=y+(x/a);
    double x_wynik =((a*(c-b))/(a*a+1));
    double y_wynik = (-x/a)+c;
    y = y_wynik;
}

int main()
{
    double x, y;
    cout << "Podaj wspolrzedne punktu: ";
    cin >> x >> y;
    cout << "Podaj parametry prostej: ";
    double a, b;
    cin >> a >> b;
    symetria(x, y, a, b);
    cout << "Punkt symetryczny do danego: " << x << "," << y << endl;

    return 0;
}

Nie wiem gdzie moze byc blad bo wzor na c jest poprawny, a x wyznaczylam z rownosci -x/a +c=ax+b
Czy ktos moze orientuje sie w czym problem?

Zobacz pozostały 1 komentarz
AK
Pora na naukę debuggera.
AK
x nigdzie nie zwracasz.
P1
ale ja tu nie uzylam wielkich liter, nie romumiem :/
enedil
@polka123: w tytule wątku są
P1
aaa okej, przepraszam
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
2

a gdzie jest użycie x_wynik? :P
Co z prostą równoległą do osi OX?

Na dodatek po poprawkach i tak jest źle, bo nie przechodzi ani jednego testu: https://godbolt.org/z/xsK16s


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 5x, ostatnio: MarekR22
P1
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • Postów:12
0
Kopiuj
#include <iostream>

using namespace std;

void symetria(double& x, double& y, double a, double b)
{   double c=y+(x/a);
    double x_wynik =((a*(c-b))/(a*a+1));// miejsce na wzór
    double y_wynik = (-x/a)+c;// miejsce na wzór
    x = x_wynik;
    y = y_wynik;
}

int main()
{
    double x, y;
    cout << "Podaj wspolrzedne punktu: ";
    cin >> x >> y;
    cout << "Podaj parametry prostej: ";
    double a, b;
    cin >> a >> b;
    symetria(x, y, a, b);
    cout << "Punkt symetryczny do danego: " << x << "," << y << endl;

    return 0;
}

tak, umkął mi x, ale wciaz cos zle...

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4930
0

Żle, bo jest źle wyliczone, tak to wygląda poprawnie w pseudokodzie:

Kopiuj
def symmetry(a, b, x, y):  # a nie moze byc zerem
  c = y + (x / a)

  # ox, oy - współrzedne przeciecia prostej danej
  # z prosta do niej prostopadla przechodzaca przez dany
  # punkt S(x, y)
  ox = (c - b) / (a + (1 / a)) 
  oy = a * ox + b
  # x1, x2 - współrzedne odbicia symetrycznego punktu S,
  # srodek wektora SS', to punkt (ox, oy)
  x1 = 2 * ox - x 
  x2 = 2 * oy - y
  return x1, x2

Pozostaje rozpatzryc przypadek dla a = 0, ale to już trywialne.


_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 10 godzin
1
Kopiuj
Ax=100; Ay=a*Ax+b;
Bx=-Ax; By=a*Bx+b;
x=2*( Ax*(By-Ay)² + (Cy-Ay)*(Bx-Ax)*(By-Ay) + Cx*(Bx-Ax)² )/((By-Ay)²+(Bx-Ax)²)-Cx;
y=2*( Ay*(Bx-Ax)² + (Cx-Ax)*(By-Ay)*(Bx-Ax) + Cy*(By-Ay)² )/((By-Ay)²+(Bx-Ax)²)-Cy;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon
lion137
Jaki punkt to odbija?
_13th_Dragon
Skoro Ax,Ay,Bx,By wyliczane są z a i b to odbijany punkt to ... zgadnij z trzech raz
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4930
0

@_13th_Dragon:
https://matematyka.pl/viewtopic.php?t=27918

Kopiuj
int main() {
double x, Ax, Ay, a, b, Bx, y, By, Cy, Cx;
Cx = 2;
Cy = 0;
a = -2;
b = 9;
 Ax =100; Ay=a*Ax+b;
Bx=-Ax; By=a*Bx+b;
x=2*( Ax*(By-Ay) * (By - Ay) + (Cy-Ay)*(Bx-Ax)*(By-Ay) + Cx*(Bx-Ax) * (Bx - Ax) )/((By-Ay) * (By - Ay)+(Bx-Ax) * (Bx - Ax))-Cx;
y=2*( Ay*(Bx-Ax) * (Bx - Ax) + (Cx-Ax)*(By-Ay)*(Bx-Ax) + Cy*(By-Ay)* (By - Ay) )/((By-Ay) * (By - Ay) +(Bx-Ax) * (Bx - Ax))-Cy;
std::cout << x<<"\n";
std::cout << y<<"\n";
}

Daje inne wyniki niż obliczenia w linku, (sprawdzone)
Edycja: Po poprawnym podaniu danych, Cx, Cy - punkt odbijany, a, b - współczynniki prostej, liczy poprawnie.


edytowany 1x, ostatnio: lion137
Zobacz pozostałe 7 komentarzy
_13th_Dragon
Bardzo przepraszam, to podstawy programowania się kłaniają :D Jakie wartości Cx,Cy podstawiasz w równanie?
lion137
Rzeczywiście, a o to Cx, Cy?
_13th_Dragon
To ten punkt odbijany.
lion137
Dzięki, wyglada, że jest OK, nie mogłeś tego w poście napisać, jak dane podawać?
_13th_Dragon
Przecież to logicznie wynika z równań, użyte do obliczenia: Ax,Ay,Bx,By,Cx,Cy z tego Ax,Ay,Bx,By wyliczane z a,b więc co zostaje?
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4930
0

Więc matematyka się kłania. Ja sprawdziłem na https://www.wolframalpha.com/ oraz na wizualizacj

OK, matematyka, weźmy coś oczywistego, prosta: y = x, czyli a = 1, b = 0, punkt do odbicia: (1, 0); widzisz to, że musi się odbić na (0, 1). Podstawiam do Twojego programu: a = 1, b = 0, x = 1, y = 0, wynik: (0, 0). Czyli Masz buga, oczywiscie mój pseudokod liczy poprawnie


_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 10 godzin
0

@lion137:

lion137 napisał(a):

Więc matematyka się kłania. Ja sprawdziłem na https://www.wolframalpha.com/ oraz na wizualizacj

OK, matematyka, weźmy coś oczywistego, prosta: y = x, czyli a = 1, b = 0, punkt do odbicia: (1, 0); widzisz to, że musi się odbić na (0, 1). Podstawiam ....

screenshot-20201119012427.png


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
lion137
Sorry, nie kumam, jakiś excel, o co chodzi? Gdzie debugging Twojego błędnego algorytmu?
_13th_Dragon
Wartości podstawione w excelu, ty swój program debugowałeś? wolframalpha.com - nie uznajesz; excell - nie uznajesz; wizualizacji odpalić nie możesz; swój kod napisać nie potrafisz nie wiem jak z tobą rozmawiać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.