FUNKCJA WYZNACZAJACA PUNKTY SYMETRYCZNE

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


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?

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

0
#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...

0

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

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.

1
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;
0

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

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.

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1