Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2014, 15:04   #11
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

как мне реализовать определение пересечения двух отрезков и как это будет влиять на решение?
yura1234 вне форума Ответить с цитированием
Старый 16.03.2014, 21:00   #12
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
как мне реализовать определение пересечения двух отрезков
решить систему уравнений с двумя линиями, определенными по точкам концов отрезков: a1*x + b1*y + c1 = 0, a2*x + b2*y + c2 = 0
потом определить, что полученное решение принадлежит обоим отрезкам, т.е. : Xresult <= max(X11, X12) &&
Xresult >= min(X11, X12) &&
Xresult <= max(X21, X22) &&
Xresult >= min(X21, X22)
(или проверять по у, тут это не принципиально)
Если решение существует и все условия истинны, то тогда отрезки пересекаются.

Но это мутно и длинно, через векторное произведение проще. там всего лишь надо определить, что результаты имеют одинаковый знак. Вектора, ессно, рисовать из одной опорной точки - одного из концов отрезка линии
Цитата:
и как это будет влиять на решение?
Вместо вывода с цифрой-расстоянием будет сообщение, что линия треугольник пересекает, и пусть пользователь сам думает, какое тогда расстояние от линии до треугольника - то ли ноль, то ли суп из петрушки.
Smogg вне форума Ответить с цитированием
Старый 17.03.2014, 16:10   #13
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

Цитата:
Program geometr4;
{Пересекаются ли 2 отрезка?}
Const _Eps: Real=1e-4; {точность вычслений}
var x1,y1,x2,y2,x3,y3,x4,y4: real;
var v1,v2,v3,v4: real;
function RealLess(Const a, b: Real): Boolean; {Строго меньше}
begin
RealLess := b-a> _Eps
end; {RealLess}
function VektorMulti(ax,ay,bx,by:real): real;
{ax,ay - координаты a
bx,by - координаты b }
begin
vektormulti:= ax*by-bx*ay;
end;
Function LinesCross(x1,y1,x2,y2,x3,y3,x4,y4: real): boolean;
{Пересекаются ли отрезки?}
begin
v1:=vektormulti(x4-x3,y4-y3,x1-x3,y1-y3);
v2:=vektormulti(x4-x3,y4-y3,x2-x3,y2-y3);
v3:=vektormulti(x2-x1,y2-y1,x3-x1,y3-y1);
v4:=vektormulti(x2-x1,y2-y1,x4-x1,y4-y1);
if RealLess(v1*v2,0) and RealLess(v3*v4,0)
{v1v2<0 и v3v4<0, отрезки пересекаются}
then LinesCross:= true
else LinesCross:= false
end; {LinesCross}
begin {main}
writeln('Введите координаты отрезков: x1,y1,x2,y2,x3,y3,x4,y4');
readln( x1,y1,x2,y2,x3,y3,x4,y4);
if LinesCross(x1,y1,x2,y2,x3,y3,x4,y4)
then writeln ('Да')
else writeln ('Нет')

end.
есди это в си перевести нормально будет?
yura1234 вне форума Ответить с цитированием
Старый 17.03.2014, 17:21   #14
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

Цитата:
v1:=vektormulti(x4-x3,y4-y3,x1-x3,y1-y3);
v2:=vektormulti(x4-x3,y4-y3,x2-x3,y2-y3);
v3:=vektormulti(x2-x1,y2-y1,x3-x1,y3-y1);
v4:=vektormulti(x2-x1,y2-y1,x4-x1,y4-y1);
if RealLess(v1*v2,0) and RealLess(v3*v4,0)
{v1v2<0 и v3v4<0, отрезки пересекаются}
then LinesCross:= true
else LinesCross:= false
как эту часть "запилить" в си и, как учесть возможность пересечения разными отрезками треугольника?
yura1234 вне форума Ответить с цитированием
Старый 17.03.2014, 17:37   #15
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
есди это в си перевести нормально будет?
Наверно, если работает)
Smogg вне форума Ответить с цитированием
Старый 17.03.2014, 17:40   #16
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
v1:=vektormulti(x4-x3,y4-y3,x1-x3,y1-y3);
v2:=vektormulti(x4-x3,y4-y3,x2-x3,y2-y3);
v3:=vektormulti(x2-x1,y2-y1,x3-x1,y3-y1);
v4:=vektormulti(x2-x1,y2-y1,x4-x1,y4-y1);
if RealLess(v1*v2,0) and RealLess(v3*v4,0)
{v1v2<0 и v3v4<0, отрезки пересекаются}
then LinesCross:= true
else LinesCross:= false
Код:
v1=vektormulti(x4-x3,y4-y3,x1-x3,y1-y3);
v2=vektormulti(x4-x3,y4-y3,x2-x3,y2-y3);
v3=vektormulti(x2-x1,y2-y1,x3-x1,y3-y1);
v4=vektormulti(x2-x1,y2-y1,x4-x1,y4-y1);
if (RealLess(v1*v2,0) && RealLess(v3*v4,0))
    return true;
else 
    return false;
Smogg вне форума Ответить с цитированием
Старый 17.03.2014, 17:41   #17
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

и как ограничить эти все координаты [x_k] [y_k] [x_m] [y_m] [x_a] [y_a] [x_b] [y_b] [x_с] [y_с], от +-1000?
yura1234 вне форума Ответить с цитированием
Старый 17.03.2014, 17:51   #18
yura1234
Пользователь
 
Регистрация: 13.03.2014
Сообщений: 23
По умолчанию

самое главное спросить забыл, как можно представить это в си?
Цитата:
Const _Eps: Real=1e-4; {точность вычислений}
function RealLess(Const a, b: Real): Boolean; {Строго меньше}
begin
RealLess := b-a> _Eps
end; {RealLess}
function VektorMulti(ax,ay,bx,by:real): real;
{ax,ay - координаты a
bx,by - координаты b }
begin
vektormulti:= ax*by-bx*ay;
end;
Function LinesCross(x1,y1,x2,y2,x3,y3,x4,y4: real): boolean;
и можно после
Код:
 if (RealLess(v1*v2,0) && RealLess(v3*v4,0))
    return true;(здесь сделать сразу вывод на экран, что пересекаются)
else 
    return false;(а здесь продолжить вычисления по моему коду?);
yura1234 вне форума Ответить с цитированием
Старый 17.03.2014, 20:19   #19
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
и как ограничить эти все координаты [x_k] [y_k] [x_m] [y_m] [x_a] [y_a] [x_b] [y_b] [x_с] [y_с], от +-1000?
В момент ввода проверяете. Что-нить типа:
Код:
int n;
whle(1){
scanf("%d", &n);
if (abs(n)>1000)
  printf("number out of range [-1000 ... 1000] Please, enter again.");
else
  break; 
}
Smogg вне форума Ответить с цитированием
Старый 17.03.2014, 20:29   #20
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от yura1234 Посмотреть сообщение
самое главное спросить забыл, как можно представить это в си?
Да, ладно) Написали программу, и не сможете перевести чужой код на С?
Единственно, что дельфи можно присвоить имени функции некое значение. Тогда это будет возвращаемым значением.
RealLess := 6789;
Ну, и свой способ закавычивания коммента.
Цитата:
Код:
 if (RealLess(v1*v2,0) && RealLess(v3*v4,0))
    return true;(здесь сделать сразу вывод на экран, что пересекаются)
else 
    return false;(а здесь продолжить вычисления по моему коду?);
Пожалуйста, кто мешает?
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны три сторони треугольника a,b,c, написать программу для вычисления трёх высот данного треугольника giganto97 Паскаль, Turbo Pascal, PascalABC.NET 4 13.10.2013 11:00
Даны декартовы координаты вершин треугольника (в плоскости). Разработать проект, вычисляющий площадь и периметр этого треугольника Яночка190 Общие вопросы Delphi 1 12.01.2013 12:49
найти расстояние от произвольной точки до ближайшей стороны треугольника. Неправильно находит расстояние zaira001002 Помощь студентам 4 05.11.2012 20:55
как найти расстояние между отрезком и прямой? student_92 Общие вопросы C/C++ 16 20.03.2012 21:50
кратчайшее расстояние от заданной точки до ближайщей стороны треугольника ddeman666 Помощь студентам 1 03.05.2010 14:47