Форум программистов, компьютерный форум CyberForum.ru

Класс точка, ребро, плоскость - C++

Восстановить пароль Регистрация
 
airolove
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 10
13.06.2014, 16:14     Класс точка, ребро, плоскость #1
Здравствуйте, помогите, пожалуйста, с такой задачей.

Есть три класса: точка, ребро, плоскость. Для класса точка надо написать конструктор и функцию, которая будет вычислять расстояние между точками. Точки имеют координаты http://www.cyberforum.ru/cgi-bin/latex.cgi?(x,y,z).

В классе ребро есть две точки http://www.cyberforum.ru/cgi-bin/latex.cgi?start и http://www.cyberforum.ru/cgi-bin/latex.cgi?end, которые берутся из предыдущего класса. В этом классе ребро надо написать конструктор, который будет находить направляющий вектор по этим точкам. Далее ещё нужна функция, которая будет искать расстояние от точки до ребра.

В классе плоскость, собственно, нужен конструктор плоскости по трем точкам. Нужно находить отклонение точки, возвращая только знак http://www.cyberforum.ru/cgi-bin/latex.cgi?+ или http://www.cyberforum.ru/cgi-bin/latex.cgi?-. И ещё есть функция, которая будет проверять, лежат ли какие точки векторов в одной плоскости.

Собственно, первый класс я написал, точка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Point {
public:
double x, y, z;
Point(double X = 0, double Y = 0, double Z = 0) : x(X), y(Y), z(Z) {} // Конструктор
double dist(double x1, double y1, double z1) // расстояние между точками
{
double dx = x - x1;
double dy = y - y1;
double dz = z - z1;
return sqrt( dx * dx + dy * dy + dz * dz);
}
};
А вот со вторым классом есть проблемы, не очень понимаю, как правильно написать сам процесс вычисления направляющего вектора.
C++
1
2
3
4
5
6
7
8
class Side{
    Point start,end;
    Side(Point v1, Point v2)
    {
         start(v1);
         end(v2);
      }
};
То есть математически всё просто, есть http://www.cyberforum.ru/cgi-bin/latex.cgi?A(x1, y1, z1), B(x2, y2, z2) отсюда направляющий вектор http://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{AB} = (x2 - x1; y2 - y1; z2 - z1). Но как это написать, если у меня есть только точка http://www.cyberforum.ru/cgi-bin/latex.cgi?start и http://www.cyberforum.ru/cgi-bin/latex.cgi?end. И пробовал писать функцию расстояния от точки до ребра. Но я как понял, мне нужно действовать так:

1. Мы знаем a,b,c и получаем d - коэффициенты в уравнении плоскости
2. Вычисляем точку пересечения ребра с плоскостью
3. Ищем расстояние между исходной точкой и точкой пересечения.

Но всё упирается в то, что я не могу написать это правильно программно. С 3-м классом пока что только догадки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 16:14     Класс точка, ребро, плоскость
Посмотрите здесь:

C++ Класс TPlane, описывающий плоскость в пространстве
создать класс точка на С++ C++
C++ Создайте класс Точка
Класс двумерная точка и класс многоугольник C++
C++ Создать класс точка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
13.06.2014, 19:56     Класс точка, ребро, плоскость #2
1. функция вычисления расстояния между двумя точками внешняя по отношению к точкам сущность, не стоит описывать её как элемент класса.
2. опишите вектор либо так же как считали: запоминанием трех координат, либо вычислением элемент-функции Side::get_pvector() с тем, чтобы вычислять его по месту требования. Второй случай предпочтительней с точки зрения дизайна, но потребует уделить внимание передаче аргументов (и времени их жизни). Вычисление расстояния от точки до ребра геометрически определено только в случае, если на ребро можно опустить перпендикуляр. В случае, если проецирование не возможно, следует определить поведение. (Так, можно ожидать, что будет найдено расстояние до ближайшей точки ребра или до середины ребра или брошен эксепшн.)
3.В рамках задачи удобно задавать плоскость в общем виде: Ax+Bx+Cz+D=0, так как подстановкой координат точки в левую часть можно будет проверить либо принадлежность в случае равенства нулю либо отклонение "+" и "-" сравнивая с нулём. емнип, построение плоскости на трех точках q w e выполняется путем векторного умножения qw,we что даст A B C и подстановкой координат любой из трех точек для вычисления D .
Jewbacabra
1791 / 1506 / 540
Регистрация: 24.04.2014
Сообщений: 4,234
13.06.2014, 20:35     Класс точка, ребро, плоскость #3
Цитата Сообщение от airolove Посмотреть сообщение
конструктор, который будет находить направляющий вектор по этим точкам
что это означает? задача конструктора не находить что-либо, а инициализировать объект.
Цитата Сообщение от airolove Посмотреть сообщение
лежат ли какие точки векторов в одной плоскости.
что за точки векторов? Может имеется ввиду лежат ли два отрезка в одной плоскости?
Цитата Сообщение от airolove Посмотреть сообщение
Собственно, первый класс я написал, точка:
координаты x, y, z лучше вынести в private секцию и написать методы для получения/изменения координат.
В метод, находящий расстояние между точками лучше передавать не три числа, а объект класса Point (или константную ссылку на него)
airolove
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 10
14.06.2014, 00:58  [ТС]     Класс точка, ребро, плоскость #4
То есть для расстояния между точками код примет такой вид?
C++
1
2
3
4
double Point::dist(Point dis) const
{
return sqrt((x-x.dis)*(x-x.dis)+(y-y.dis)*(y-y.dis)+(z-z.dis)*(z-z.dis));
}
Была мысль по поводу направляющего вектора:
C++
1
2
3
4
5
6
7
8
side(Point p1, Point p2)
{
start = p1;
end = p2;
vec[0] = end.x - start.x;
vec[1] = end.y - start.y;
vec[2] = end.z - start.z;
}
Только оно, скорее всего, не будет работать.

Добавлено через 3 часа 13 минут
Забыл дописать, vec это те самые A,B,C. Только как правильно это всё объявить я ещё не понял
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
14.06.2014, 01:53     Класс точка, ребро, плоскость #5
Имел ввиду следующее: не рекомендуется вычислять расстояние между точками методами класса Точка (google> information expert).
должно быть что-то вроде:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class rawPoint
{
    public:
    //в геттерах / сеттерах нет смысла, так как все равно проверки не делаем.
    //фактически используем class вместо struct, в C++ это одно и то же с точностью
    //до доступа по умолчанию. (ну и наследование по умолчанию другое)
        double x;
        double y;
        double z;
        rawPoint(double a, double b,double c):x(a),y(b),z(c){};
};
 
double dist(rawPoint& a, rawPoint& b)
{
    //внешняя по отношению к rawPoint функция, если поля класса будут приватными,
    //следует объявлять как friend-function.
    return sqrt(
                pow((a.x - b.x),2)
                + pow((a.y - b.y),2)
                + pow((a.z - b.z),2)
            );
}

про направляющий вектор - да, все верно и работать будет. Вообще, в вашей программе удобно хранить вектор как координаты точки в которую он укажет, если установить его в начало координат (point-vector), собственно его координаты и получаются вычитанием координат старта из координат конца.
airolove
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 10
15.06.2014, 00:13  [ТС]     Класс точка, ребро, плоскость #6
А как всё же правильно описать функцию расстояние от ребра до точки. Допустим назовём её double side::dist(point p). Точку p нужно найти. У нас есть всего лишь переменные класса start, end и соответственно vec[]. Ну у точки p координаты соответственно p.x,p.y,p.z. Сначала надо найти уравнение плоскости, вернее коэффициент D. A,B,C я так понимаю это точки нормали, то есть вообще это vec[0],vec[1],vec[2]. Потом уже получить точку пересечения прямой и плоскости, это параметр t в уравнении http://www.cyberforum.ru/cgi-bin/latex.cgi?t=\frac{(x-x0)}{l} = \frac{(y - y0)}{m}= \frac{(z - z0)}{n}. x0,y0,z0 точка, через которую проходит прямая. Или я что-то не так говорю?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2014, 15:27     Класс точка, ребро, плоскость
Еще ссылки по теме:

C++ Класс "Точка". Функция - определение в каком координатном угле находится точка
Даны координаты точек х1, у1, ... х15, у15. Если точка попадает на плоскость, ограниченную кругом x2 + y2 = R2 - вывести ее координаты C++
C++ Класс Точка на плоскости

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
airolove
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 10
16.06.2014, 15:27  [ТС]     Класс точка, ребро, плоскость #7
Написал вроде функцию от ребра до точки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
double side::dist(point p)
{
d = - (p.x*vec[0]+p.y*vec[1]+p.z*vec[2]);
t= - (vec[0]*x0+vec[1]*y0+vec[2]*z0 + d) / (vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]);
 
if(t>=0 && t<=1)
{
    point p1 = new point (t*l + start.x, t*m + start.y, t*n + start.z);
    return p1.dist(p2);
}
if(t<0) // если t<0, то у нас точка end (t=1)
{
point p1 = new point (end.x, end.y, end.z);
return p1.dist(p2);
}
if(t>0) // если t>0, то у нас точка start (t=0)
{
point p1 = new point (start.x, start.y, start.z);
return p1.dist(p2);
}
Добавлено через 1 час 2 минуты
Поможет кто решить проблему. Теперь ругается на
Кликните здесь для просмотра всего текста
[BCC32 Error] File1.cpp(22): E2238 Multiple declaration for 'Point::dista'
[BCC32 Error] File1.cpp(42): E2090 Qualifier 'Side' is not a class or namespace name
[BCC32 Error] File1.cpp(42): E2040 Declaration terminated incorrectly

Вот сам код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <vcl.h>
#include <stdlib.h>
#include <tchar.h>
#include <iostream>
 
class Point {
public:
double x, y, z;
// Конструктор
Point(double X = 0, double Y = 0, double Z = 0) : x(X), y(Y), z(Z) {}
double dista(Point) const;
};
 
double Point::dista(Point dis) const
{
return sqrt((x-x.dis)*(x-x.dis)+(y-y.dis)*(y-y.dis)+(z-z.dis)*(z-z.dis);
}
 
class Side{
Point start,end;
double dist(Point);
    getSide(Point p1, Point p2)
{
float vec[3];
start = p1;
end = p2;
vec[0] = end.x - start.x;
vec[1] = end.y - start.y;
vec[2] = end.z - start.z;
}
};
 
double Side::dist(Point p)
{
d = - (p.x*vec[0]+p.y*vec[1]+p.z*vec[2]);
t= - (vec[0]*x0+vec[1]*y0+vec[2]*z0 + d) / (vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]);
 
if(t>=0 && t<=1)
{
    Point p1 = new Point (t*l + start.x, t*m + start.y, t*n + start.z);
    return p1.dist(p2);
}
if(t<0) // если t<0, то у нас точка end (t=1)
{
Point p1 = new Point (end.x, end.y, end.z);
return p1.dist(p2);
}
if(t>0) // если t>0, то у нас точка start (t=0)
{
Point p1 = new Point (start.x, start.y, start.z);
return p1.dist(p2);
}
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
Yandex
Объявления
16.06.2014, 15:27     Класс точка, ребро, плоскость
Ответ Создать тему
Опции темы

Текущее время: 20:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru