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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
airolove
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 10
#1

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

13.06.2014, 16:14. Просмотров 662. Ответов 6
Метки нет (Все метки)

Здравствуйте, помогите, пожалуйста, с такой задачей.

Есть три класса: точка, ребро, плоскость. Для класса точка надо написать конструктор и функцию, которая будет вычислять расстояние между точками. Точки имеют координаты 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     Класс точка, ребро, плоскость
Посмотрите здесь:

Класс TPlane, описывающий плоскость в пространстве - C++
Собственно само задание: переписать программу, используя новые знания о классах и перезагрузке операций. Использовать динамическое...

Класс точка(наследование) - C++
Тема:ПРоизводные классы.Наследование Создать класс Точка, которая имеет координаты. Класс Эллипсов, и класс Окружностей. Определить...

создать класс точка на С++ - C++
люди понимающие С++,помогите пожалуйста решить вот такую задачу,я с такими никогда не сталкивался (((( "создать класс точка,имеющую...

Создать класс точка - C++
Создать класс точка, содержащий в качестве параметров x- и y-координаты, класс эллипс, и класс окружность. Определить иерархию типов....

Создайте класс Точка - 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
Эксперт PHP
2260 / 1924 / 721
Регистрация: 24.04.2014
Сообщений: 5,596
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++
Создать класс «точка», содержащий её координаты на плоскости, классы «эллипс» и «окружность». Определить иерархию классов. Определить: ...

Создать класс “точка” (Point) - C++
Создать класс “точка”(Point) Реализовать следующие функции -Конструкторы (по умолчанию, полный, копирования) -Деструктор ...

Описать класс Двумерная Точка, реализовать операции отношения - C++
Кто знает как это сделать?

Класс POINT (ТОЧКА), который может вводить и выводить точки с заданными координатами - C++
Создайте класс POINT (ТОЧКА), который может вводить и выводить точки с заданными координатами. Создайте 5 объектов класса POINT ...

Дано ребро куба - C++
Помогите!!!! Нужно сделать в С++ 1. Дано ребро куба. Вычислить площадь поверхности шара, вписанного в него. 2. Найти сумму натуральных...

Как удалить ребро в графе? - C++
Имеется граф с N вершинами и заданный списком смежности. Требуется удалить ребро, который соединяет вершины a и b. Ребро задается...


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

Или воспользуйтесь поиском по форуму:
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     Класс точка, ребро, плоскость
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru