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

Найти проекцию точки на прямую (С++) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.89
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
05.01.2011, 23:38     Найти проекцию точки на прямую (С++) #1
Скоро курсач сдавать, в одном задании не успеваю разобраться как делать.
Задание такое:
Создать заголовочный файл, содержащий определения структур, описывающих следующие геометрические объекты: 1.) точку на плоскости, 2.) вектор на плоскости (в моём варианте это походу не понадобится), 3.) прямую на плоскости. С помощью этих структур найти проекцию точки на прямую.

Вроде должно быть быстро, поможите?

(Я делаю на Builder 6, С++ на консоли)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2011, 23:38     Найти проекцию точки на прямую (С++)
Посмотрите здесь:

C++ Перпендикуляр из точки на прямую
C++ Массив, заполненный 1 и 0. Найти путь, состоящий из нулей, от точки до точки.
C++ Найти среди прямых, заданных на плоскости, ту прямую, которая имеет наибольшее число пересечений с остальными
Найти самый короткий путь от точки до точки в матрице C++
Как найти координаты точки на прямой удаленной от заданной точки на х C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.01.2011, 23:42     Найти проекцию точки на прямую (С++) #2
покажите ваши нароботки
Создать заголовочный файл, содержащий определения структур, описывающих следующие геометрические объекты: 1.) точку на плоскости,
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
05.01.2011, 23:50     Найти проекцию точки на прямую (С++) #3
Цитата Сообщение от kiberg Посмотреть сообщение
1.) точку на плоскости
- POINT
2) Опять POINT.
3) А тут уже RECT (точка + вектор)
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
06.01.2011, 00:36  [ТС]     Найти проекцию точки на прямую (С++) #4
Цитата Сообщение от Maxwe11 Посмотреть сообщение
покажите ваши нароботки
В этом то и проблема, это совершенно новое для меня. Может кто-нибудь покажет как создать заголовочный файл содержащий определение структуры описывающей например точку на плоскости или прямую на плоскости. Дальше я сам скорее всего разберусь.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
06.01.2011, 00:51     Найти проекцию точки на прямую (С++) #5
Структура - точка в 2D пространстве
C
1
2
3
4
5
struct point
{
   double x,
   y;
};
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
06.01.2011, 14:46  [ТС]     Найти проекцию точки на прямую (С++) #6
Цитата Сообщение от asics Посмотреть сообщение
Структура - точка в 2D пространстве
C
1
2
3
4
5
struct point
{
   double x,
   y;
};
А заголовочный файл тогда так будет? :
C++
1
2
3
4
5
6
7
/* файл struct.h: */
#pragma once
struct point
{
   double x,
   y;
};
А прямую на плоскости как тогда сделать?
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
06.01.2011, 15:11     Найти проекцию точки на прямую (С++) #7
Цитата Сообщение от kiberg Посмотреть сообщение
А прямую на плоскости как тогда сделать?
наверное надо задать уравнение прямой или координаты точек на данной прямой
если не изменяет память то, любая прямая на плоскости может быть задана уравнением первого порядка. Ах + Ву + С = 0
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
06.01.2011, 15:24     Найти проекцию точки на прямую (С++) #8
для начала стоит прочесть учебник математики
Если задана точка М(х0, у0), то расстояние до прямой Ах + Ву + С =0 определяется как
Изображения
 
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2011, 16:50     Найти проекцию точки на прямую (С++)
Еще ссылки по теме:

C++ не получается задачка (Дана точка A и множество B из N точек. Найти номер точки из множества B, наиболее удаленной от точки A)
Найти минимальное расстояние от точки до точки C++
C++ Найти координаты всех пикселей образующих прямую

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

Или воспользуйтесь поиском по форуму:
kiberg
0 / 0 / 0
Регистрация: 29.12.2010
Сообщений: 8
07.01.2011, 16:50  [ТС]     Найти проекцию точки на прямую (С++) #9
Цитата Сообщение от kiberg Посмотреть сообщение
Задание :
Создать заголовочный файл, содержащий определения структур, описывающих следующие геометрические объекты: 1.) точку на плоскости, 2.) вектор на плоскости (в моём варианте это не понадобится), 3.) прямую на плоскости. С помощью этих структур найти проекцию точки на прямую.
Пример как находить проекцию точки на прямую здесь: http://www.neive.by.ru/geometriia/pr...zadatcha5.html или здесь: http://***************/question/20365534/

Я сделал, вроде всё работает. Посмотрите нормально или можно как-то короче сделать:
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* файл struct.h: */
#pragma once
 
struct Point2D
{
   double x, y;
};
 
struct Line2D
{
   double x, y;
   double A, B, C;
};
 
 
/* файл Unit1.cpp: */
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include "struct.h"
 
 
int main()
{
Point2D point;
Line2D line;
 
cout << "Zadayte koordinaty tochki (x, y)\n";
cout << "Vvedite x koordinatu tochki ";
cin >> point.x;
cout << "Vvedite y koordinatu tochki ";
cin >> point.y;
cout << "Zadayte koefficienty v uravnenii pryamoy A*x + B*y + C = 0\n";
cout << "Vvedite A koefficient pryamoy ";
cin >> line.A;
cout << "Vvedite B koefficient pryamoy ";
cin >> line.B;
cout << "Vvedite C koefficient pryamoy ";
cin >> line.C;
 
//ïðîâåðÿåì Г·ГІГ® îáГ* êîýô. Гў ГіГ°-ГЁГЁ ïðÿìîé Г*ГҐ=0
if ((line.A == 0) && (line.B == 0))
  {
  cout << "Nekorrektniy vvod";
  getch();
  return 0;
  }
 
double M, N, L;
double b;
 
//ñëó÷Г*Г© åñëè êîýôôèöèåГ*ГІ ïðè x=0 èëè îáГ* êîýôôèöèåГ*ГІГ* Г*ГҐ=0 (ГІ.ГҐ. Г*îðìГ*ëüГ*ûé ñëó÷Г*Г©)
if( line.A == 0 || ((line.A != 0) && (line.B != 0)) )
{
 
//line.y = -M*line.x - L; - ÂûðГ*çèì Гі Гў ГіГ°Г*ГўГ*ГҐГ*ГЁГЁ ïðÿìîé, ãäå M = (line.A / line.B);
//ÒåîðåìГ*. ГЏГіГ±ГІГј Г¤Г*Г*Г» äâå ïðÿìûå  a ГЁ b ГЁ èçâåñòГ*Г» ГЁГµ ГіГ°Г*ГўГ*ГҐГ*ГЁГї Гі=kx+b ГЁ y2=k2x+b2.
//         Г€ åñëè ïðÿìûå a ГЁ b ïåðïåГ*äèêóëÿðГ*Г», ГІГ® k = -1 / k2
 
// Гў ñëó÷Г*ГҐ åñëè êîýô. ïðè Гµ=0, ГІГ® N=0
if (line.A == 0)
  N = 0; //ГІ.ГЄ. N = (line.B / line.A) = 0
else
  N = (line.B / line.A);
 
  M = (line.A / line.B);
  L = (line.C / line.B);
 
//ïîäñòГ*âëÿåì êîîðäèГ*Г*ГІГ» òî÷êè ГўГ® 2-îå ГіГ°-ГЁГҐ ГЁ Г*Г*õîäèì êîýô. b
//line.y2 =  N*line.x + b
b = point.y - N*point.x;
 
//ГЁГ§ 2-ГіГµ ïîëó÷åГ*Г*ûõ ГіГ°-ГЁГ© Г*Г*õîäèì x ГЁ y - ГЅГІГ® êîîðäèГ*Г*ГІГ» ïðîåêöèè
//ïðèðГ*ГўГ*ГЁГўГ*ГҐГ¬ ГЇГ°Г*âûå Г·Г*Г±ГІГЁ ГіГ°-ГЁГ©: line.y = -M*line.x - L  ГЁ  line.y =  N*line.x + b
//N*line.x + b + M*line.x + L = 0
//(N + M)*line.x = - L - b
//òîãäГ* line.x = (- L - b) / (N + M)
if((N + M) == 0)
  line.x = point.x;
else
  line.x = (- L - b) / (N + M);
 
line.y = -M*line.x - L;
}
 
 
//ñëó÷Г*Г© åñëè êîýôôèöèåГ*ГІ ïðè y = 0
if( line.B == 0 )
{
 
//line.x = -M*line.y - L; - ÂûðГ*çèì x Гў ГіГ°Г*ГўГ*ГҐГ*ГЁГЁ ïðÿìîé, ãäå M = (line.B / line.A)
//ÒåîðåìГ*. ГЏГіГ±ГІГј Г¤Г*Г*Г» äâå ïðÿìûå  a ГЁ b ГЁ èçâåñòГ*Г» ГЁГµ ГіГ°Г*ГўГ*ГҐГ*ГЁГї x=ky+b ГЁ x2=k2y+b2.
//         Г€ åñëè ïðÿìûå a ГЁ b ïåðïåГ*äèêóëÿðГ*Г», ГІГ® k = -1 / k2
 
  N = 0; //ГІ.ГЄ. N = (line.A / line.B) = 0
  M = 0; //ГІ.ГЄ. M = (line.B / line.A) = 0
  L = (line.C / line.A);
 
//ïîäñòГ*âëÿåì êîîðäèГ*Г*ГІГ» òî÷êè ГўГ® 2-îå ГіГ°-ГЁГҐ ГЁ Г*Г*õîäèì êîýô. b
//line.x2 =  N*line.x + b
b = point.y - N*point.x;
 
//ГЁГ§ 2-ГіГµ ïîëó÷åГ*Г*ûõ ГіГ°-ГЁГ© Г*Г*õîäèì x ГЁ y - ГЅГІГ® êîîðäèГ*Г*ГІГ» ïðîåêöèè
//ïðèðГ*ГўГ*ГЁГўГ*ГҐГ¬ ГЇГ°Г*âûå Г·Г*Г±ГІГЁ ГіГ°-ГЁГ©: line.x = -M*line.y - L  ГЁ  line.x =  N*line.y + b
//N*line.y + b + M*line.y + L = 0
//(N + M)*line.y = - L - b
//òîãäГ* line.y = (- L - b) / (N + M)
if((N + M) == 0)
  line.y = point.y;
else
  line.y = (- L - b) / (N + M);
 
line.x = -M*line.y - L;
}
 
cout << "\nProekciya tochki (" << point.x << ", " << point.y << ") " << "na pryamuyu " << line.A << "x";
if(line.B > 0) cout << "+";
cout << line.B << "y";
if(line.C > 0) cout << "+";
cout << line.C << "=0 - (" << line.x << ", " << line.y << ")";
 
getch();
return 0;
}
Yandex
Объявления
07.01.2011, 16:50     Найти проекцию точки на прямую (С++)
Ответ Создать тему
Опции темы

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