Тема: informatic.mccme.ru (Geometry)

Постройте отражение

Заданы коэффициенты уравнения прямой a, b и с и координаты точки A (xa, ya). Найдите точку A’, которая является отражением точки A относительно заданной прямой.



Исходные данные: в начале с клавиатуры вводятся коэффициенты уравнения прямой, затем координаты точки A. Исходные данные являются целыми числами, по модулю не превышающими 1000



Результат: выведите координаты точки A’ с точностью до пятого знака после запятой.


input #1
1 0 0 3  1   
output #1
-3 1

input #2
1 -1 0 1 0   
output #2
0 1


#include <iostream>
#include <cmath>

using namespace std;


struct Point {

    double x,y;
    Point()
    {
        x=y=0;
    }
    Point(double xx,double yy)
    {
        x=xx;
        y=yy;
    }

    void read()
    {
        scanf("%lf%lf",&x,&y);
    }

    Point operator-(Point a)
    {
        return Point(x-a.x,y-a.y);
    }
    double operator*(Point a)
    {
        return x*a.y-y*a.x;    
    }
    double scal(Point a)
    {
        return x*a.x+y*a.y;
    }

    void makeLen(double l)
    {
        double dist = sqrt(x*x+y*y);
        x*=l/dist;
        y*=l/dist;
    }


};

double a,b,c;


int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    
    scanf("%lf%lf%lf",&a,&b,&c);
    Point p ;

    p.read();

    double l = fabs(a*p.x+b*p.y+c)/sqrt(a*a+b*b);

    Point norm = Point(a,b);
    Point p1;

    if (a!=0) p1= Point(-c/a,0); else
    p1 = Point(0,-c/b);
 

    if (norm.scal(p1)  < 0 ) norm.x*=-1,norm.y*=-1;

    norm.makeLen(l);     
    Point p2 = p - norm;

    printf("%.5lf %.5lf",p2.x  - norm.x , p2.y-norm.y);
    return 0;
}                       

Помогите плз , WA #3 тест. Че за проблема . Я думаю ошибка из за погрешности.

2 Отредактировано ScalAr (2009-12-01 18:16:04)

Re: informatic.mccme.ru (Geometry)

ИМНО, проще находить отражение так: пусть исходная точка (x0,y0), новая (x1,y1). Тогда
a*x1+b*y1=-a*x0-b*y0-2*c, 
-b*x1+a*y1=-b*x0+a*y0.
Решаешь эту систему, получаешь ответ.

3

Re: informatic.mccme.ru (Geometry)

Читай предыдущую тему, там у участника похожие функции, и ошибка была в погрешности.
Вроде вот в этом месте.

if (norm.scal(p1)  < 0 ) norm.x*=-1,norm.y*=-1;

Или чуть выше.

Re: informatic.mccme.ru (Geometry)

Это Мой Код .  И Там другая задача . а это другая .

Re: informatic.mccme.ru (Geometry)

блииин тупая ошибка

    if (norm.scal(p1)  <  0) norm.x*=-1,norm.y*=-1;

изменил на

    if (norm.scal(p-p1)  <  0) norm.x*=-1,norm.y*=-1;

спасибо всемммм. Но лучше через уравнение . Код получается короче.

6

Re: informatic.mccme.ru (Geometry)

Я же говорил что вот в ней smileroll