Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсчет точек, лежащих рядом с линией 
:(
    Опции темы
Dementor
Дата 8.8.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Всем привет!
Есть отрезок, рядом с которым лежит множество точек. Мне нужно найти те точки, которые лежат в пределах концов отрезка, т.е. они могут лежать и справа и слева от отрезка, но не могут выходить так сказать вперед и назад от него.
Сейчас я делаю так - нахожу центр отрезка и ищу точки, которые лежат не дальше, чем половина длины этого отрезка. Т.е. получается, что в поиске участвуют точки, лежащие в окружности, построенной от центра отрезка с радиусом, равным половине длины отрезка.
Вот кусок это процедуры:
Код

Xo1:= (X4 + X34)/2;
Yo1:= (Y4 + Y34)/2;
Zo1:= (Z4 + Z34)/2;
Ro:=sqrt(sqr(Xo1-X4)+sqr(Yo1-Y4));
for i := 0 to pnt-1 do
begin
X2:=(ForMaxGap[i].X-OrgX)/Units;
Y2:=(ForMaxGap[i].Y-OrgY)/Units;
Z2:=(ForMaxGap[i].Z-OrgZ)/Units;
RT[i]:=sqrt(sqr(X3-X2)+sqr(Y3-Y2)+sqr(Z3-Z2));
Rtch:=sqrt(sqr(Xo1-X2)+sqr(Yo1-Y2));
if Rtch<=Ro then
begin
NCenterArray:=NCenterArray+1;
SetLength(ForMaxGapCenter,NCenterArray);
ForMaxGapCenter[NCenterArray-1]:=ForMaxGap[i];
end;
end;

Но при этом теряются точки, которые лежат в пределах отрезка, но удалены от него вправо или влево более чем на половину длины отрезка.
Вот картинка, на которой показано все это в графике:
user posted image
Розовая линия - линия, которую я делю по условию, для получения анализируемого отрезка;
Белые, красные и коричневые точки - те самые точки, которые надо посчитать;
Красная окружность - показывает ту область, в которой ищет точки мой алгоритм;
Зеленые линии показывают тот диапазон точек, которые реально попадают в так сказать пределы отрезка.

Вопрос - как мне перестроить алгоритм для правильного поиска точек - т.е. чтобы посчитались те, которые ограничены зелеными линиями.

Я так понимаю мне надо анализировать не в окружности, а например строить параллелограмм и анализировать в нем, но как это сделать я не знаю.
Очень прошу помощи! 
PM MAIL   Вверх
Frees
Дата 8.8.2012, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Наверно лучше вопрос задать в разделе http://forum.vingrad.ru/forum/s/ab518839f7...mp;showforum=13

http://algolist.manual.ru/maths/geom/distance/pointline.php
По ссылке описано как искать расстояние до отрезка, я сам не вникал но может поможет.


Это сообщение отредактировал(а) Frees - 8.8.2012, 13:09


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Dementor
Дата 8.8.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Цитата(Frees @ 8.8.2012,  13:06)
http://algolist.manual.ru/maths/geom/distance/pointline.php
По ссылке описано как искать расстояние до отрезка, я сам не вникал но может поможет.

К сожалению расстояние до отрезка не поможет - это не поможет отсечь ненужные точки.

Тут вопрос больше геометрии наверно - как построить параллелограмм (если я вообще прав) имея только одну его сторону, т.е. как его рассчитать в delphi. Есть формулы параллельного переноса - но и как их реализовать я не понимаю.
PM MAIL   Вверх
Keeper89
Дата 8.8.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



А как ты собрался параллелограмм строить? для этого либо угол нужен, либо 3я точка.  Тогда все легко решается. 


--------------------
PM MAIL WWW   Вверх
Dementor
Дата 8.8.2012, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Цитата(Keeper89 @ 8.8.2012,  15:15)
А как ты собрался параллелограмм строить? для этого либо угол нужен, либо 3я точка.  Тогда все легко решается.

Да я вот весь день сижу и думаю как его строить. Даже на листочке рисую, чтобы хоть как-то себе это представить. Пока ничего в голову не приходит. Я после того как придумал этот подход с окружностью больше ничего "гениального" не смог сгенерировать.
PM MAIL   Вверх
rodnover
Дата 8.8.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 1
Всего: 10



Если, отрезок AB, а точки, например C1, C2,.., Сn
То ищешь скалярные произведения между парами векторов ACn и AB; BCn и BA. Если скалярные произведения > 0, то точка расположена между вершинами, если одни из них равно 0 , то прям над одной из вершин, если хоть одно произведение < 0, тогда за границами.

Это сообщение отредактировал(а) rodnover - 8.8.2012, 16:07
PM MAIL   Вверх
Dementor
Дата 8.8.2012, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Цитата(rodnover @ 8.8.2012,  16:05)
Если, отрезок AB, а точки, например C1, C2,.., Сn
То ищешь скалярные произведения между парами векторов ACn и AB; BCn и BA. Если скалярные произведения > 0, то точка расположена между вершинами, если одни из них равно 0 , то прям над одной из вершин, если хоть одно произведение < 0, тогда за границами.

Огромное спасибо, за подсказку!!! Реально помогло!!! От всей души благодарю!
PM MAIL   Вверх
rodnover
Дата 9.8.2012, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 1
Всего: 10



Всегда пожалуйста, обращайтесь. smile
PM MAIL   Вверх
Dementor
Дата 15.11.2012, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Товарищи, прошу помощи еще раз.

Существует ли способ найти точки лежащие, на определенном расстоянии до кривой?
Что имеем
1) сотни тысяч или миллионы точек с координатами X,Y,Z;
2) несколько сотен (максимум тысяч) кривых, состоящих из нескольких десятков вертексов также с трехмерными координатами.

Сейчас для поиска точек, которые лежат на заданном расстоянии от каждой из кривых я использую предложенный выше метод, мизерно доработанный мною - кривую рассматриваю как набор отрезков, для которых и идет поиск точек. Расстояние от отрезка до точки я определяю как высоту треугольника, образованного концами отрезка и анализируемой точкой. Понятно, что работает это просто супер медленно (если в файле 1 000 000 точек, а в кривой 40 отдельных отрезков, то для поиска приходятся проводить 40 000 000 вычислений).

Погуглил на счет расстояния от точки до кривой - ничего путного не нашел, поэтому и обращаюсь за помощью к вам.

Буду очень благодарен за любую помощь!

Пример моего кода:
Код

for j := 1+ to CatenaryArray[i].VertNumber-1 do
  begin
//Получаем координаты концов отрезка
    X1:=CatenaryArray[i].X[j-1];
    Y1:=CatenaryArray[i].Y[j-1];
    Z1:=CatenaryArray[i].Z[j-1];
    X2:=CatenaryArray[i].X[j];
    Y2:=CatenaryArray[i].Y[j];
    Z2:=CatenaryArray[i].Z[j];
//Ищем расстояния до всех точек из массива
    for k := 0 to PointsArrayLength-1 do
      begin
      XPoint:=(PointsArray[k].X-OrgX)/Units;
      YPoint:=(PointsArray[k].Y-OrgY)/Units;
      ZPoint:=(PointsArray[k].Z-OrgZ)/Units;
      AppOrt1:=(X1-X2)*(XPoint-X2)+(Y1-Y2)*(YPoint-Y2)+(Z1-Z2)*(ZPoint-Z2);
      AppOrt2:=(X2-X1)*(XPoint-X1)+(Y2-Y1)*(YPoint-Y1)+(Z2-Z1)*(ZPoint-Z1);
      if (AppOrt1>=0) and (AppOrt2>=0) then
        begin
         AppApp:=sqrt(sqr(X1-X2)+sqr(Y1-Y2)+sqr(Z1-Z2));
         AppPoint1:=sqrt(sqr(X1-XPoint)+sqr(Y1-YPoint)+sqr(Z1-ZPoint));
         AppPoint2:=sqrt(sqr(X2-XPoint)+sqr(Y2-YPoint)+sqr(Z2-ZPoint));
         PApp:=(AppApp+AppPoint1+AppPoint2)/2;
         SApp:=sqrt(PApp*(PApp-AppApp)*(PApp-AppPoint1)*(PApp-AppPoint2));
         AppPoint:=2*SApp/AppApp;
//Если расстояние до отрезка меньше или равно заданному, то добавляем ее в новый массив точек
        if (AppPoint<=Radius) and (PointsArray[k].Line=AppPointLine) then
        begin
          PointsArrayAppLength:=PointsArrayAppLength+1;
          SetLength(PointsArrayApp,PointsArrayAppLength);
          PointsArrayApp[PointsArrayAppLength-1]:=PointsArray[k];
        end;
      end;
  end;

PM MAIL   Вверх
de_Nis
Дата 15.11.2012, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старательный
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 19.10.2006
Где: Молдова

Репутация: нет
Всего: 6



Dementor, мне кажется, что для поиска алгоритма чего - либо, в том числе и для "...способ найти точки лежащие, на определенном расстоянии до кривой.." нужно зайти в раздел Алгоритмы (http://forum.vingrad.ru/forum/tech-algorithm-techique-method.html).
Разобравшись там с алгоритмом в принципе, если нужно, заходишь на этот подфорум для вопросов по реализации алгоритма на языке Дельфи.
--------------------
Несчастлив не тот, у кого ничего нет, а тот, кто ничего не хочет…
PM   Вверх
Dementor
Дата 15.11.2012, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 9.7.2007

Репутация: нет
Всего: нет



Цитата(de_Nis @  15.11.2012,  15:57 Найти цитируемый пост)
de_Nis

Да, наверно вы правы туда и пойду. Спасибо за совет!
Мне реализовать не так сложно, а вот придумать сам алгоритм...
Пойду туда!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.