Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Igors от Январь 12, 2012, 19:32



Название: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 12, 2012, 19:32
Добрый день

На плоскости есть выпуклый 8-угольник с центром в точке (0, 0). Гарантируется что этот центр лежит внутри, но не более того. Найти относительное расстояние relD от центра до произвольно заданной точки p, напр

p совпадает с центром, relD = 0
p снаружи, relD > 1
p на ребре, relD = 1
p внутри, relD = ???

Спасибо


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Fat-Zer от Январь 12, 2012, 21:43
ничего не понял... что за "относительное расстояние"? да и вообще условие как-то бредово звучит...
дано: выпуклый 8-угольник, включающий (0,0); точка p;
найти: расстояние от p до (0,0) [глупость какая-то(???)]

[оффтоп]
с пирамидой и конусом чего-нить вышло?


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: andrew.k от Январь 12, 2012, 21:53
Я не силен в математике, но попробую :)

1. Провести прямую из центра до точки которую рассчитываем.
2. Определить какую из граней пересекает прямая. Найти точку пересечения с ней.
3. Получаем два расстояния от центра до точки и от цетра до точки пересечения. Их отношение и будет относительное расстояния.


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 13, 2012, 00:33
..условие как-то бредово звучит...
[глупость какая-то(???)]...
Пример:радиальный градиент (цвет) для круга. В центре максимальная яркость которая плавно падает к краю, ну или наоборот. Так что, нельзя иметь градиент для чуть более сложной фигуры? Ну а если "нежелание понимать" - так я ж Вас обсуждать не заставляю  :)

с пирамидой и конусом чего-нить вышло?
Да, хотя в отдельных случаях погрешность значительна

2. Определить какую из граней пересекает прямая. Найти точку пересечения с ней.
Прошу исполнить

Пантер, перенесли тему так перенесли, не вопрос. Но мне кажется нужно ширше понимать "2D графика", а не сводить дело только к хоровому чтению Ассистента (опиума для народа).


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: andrew.k от Январь 13, 2012, 01:18
2. Определить какую из граней пересекает прямая. Найти точку пересечения с ней.
Прошу исполнить
Нужен код на с++ что ли?
Вычислять по очереди каждую сторону.
Будет два пересечения. На сколько я понимаю ровно два. Т.к. многоугольник выпуклый.
Определить какой из двух отрезков искомый тоже не сложно.

Вы такие сложные темы поднимаете, Игорс. Не пойму какие проблемы с нахождением точки пересечения прямых?
Или это стеб надо мной?)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: kambala от Январь 13, 2012, 04:32
вот это относительное расстояние - это число будет использоваться в какой-то формуле или это просто индикатор? если второе, то просто использовать перечисление: 0 - точка в центре, 1 - внутри, 2 - на ребре, 3 - за пределами.


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Пантер от Январь 13, 2012, 09:26
Igors, разве вопрос имеет какое-то отношение к Qt?


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 13, 2012, 14:41
вот это относительное расстояние - это число будет использоваться в какой-то формуле.. ?
Будет, причем весьма интенсивно, но об этом расскажу позже и в др. теме. Требуется float число.

Igors, разве вопрос имеет какое-то отношение к Qt?
Qt имеет классы для поддержки 2D графики (QPointF. QPolygon, QVector2D и др), так почему бы их не задействовать? Не спрашивать же каждый раз "как сделать это средствами Qt?" - это само собой подразумевается. 


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Пантер от Январь 13, 2012, 14:52
Qt имеет классы для поддержки 2D графики (QPointF. QPolygon, QVector2D и др), так почему бы их не задействовать? Не спрашивать же каждый раз "как сделать это средствами Qt?" - это само собой подразумевается. 
Все равно, к данному разделу эта тема имеет большее отношение.


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: kambala от Январь 13, 2012, 14:57
вот это относительное расстояние - это число будет использоваться в какой-то формуле.. ?
Будет, причем весьма интенсивно, но об этом расскажу позже и в др. теме. Требуется float число.
если формула не взята с потолка, то должно быть объяснение того, что понимается под "относительным расстоянием". вариант "отношение расстояния от центра до точки к расстоянию от центра до ребра, которое пересекает луч центр-точка" кажется очень даже подходящим и вычислительных сложностей собой не представляет.


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 13, 2012, 15:06
Все равно, к данному разделу эта тема имеет большее отношение.
Ну на "алгоритм" это не тянет - очевидно что дело сводится к нахождению пересечений. А вот как это сделать покрасивше и чтобы скорость была приличной (кратность вызовов большая) - имеет смысл обсудить.

вариант "отношение расстояния от центра до точки к расстоянию от центра до ребра, которое пересекает луч центр-точка" кажется очень даже подходящим и вычислительных сложностей собой не представляет.
Это напоминает предыдущего докладчика у которого так же "все просто" - и так же отсутствуют хоть какие-то намеки на код (пусть даже "псевдо")  :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: andrew.k от Январь 13, 2012, 15:17
намек на код (http://e-maxx.ru/algo/segments_intersection)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Tonal от Январь 17, 2012, 08:53
2 маленбких дополнения к вашей многомудрой дискуссии:
 1. Точка, относительно выпуклого многоугольника может:
   а. Лежать внутри.
   б. Совпадать с одной из вершин.
   в. Лежать на одной из граней.
   г. Лежать вне.
  Соответственно все эти случаи нужно рассматривать проводя отрезок соединяющий «центр» и точку.
 2. Если
p совпадает с центром, relD = 0
p снаружи, relD > 1
p на ребре, relD = 1
p внутри, relD = ???
то очевидно, что при p внутри, 0 < relD < 1. :)

Ежели вспомнить Qt, то в классе QRegion есть метод contains который отвечает на вопрос внутри точка или снаруже.
Но он не очень подходит для данного случая т. к. во первых неясно как трактует попадение на границу, а во вторых разработан для очень общих случаев и будет изрядно тормознее нормальных ручных вычислений. :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 17, 2012, 13:28
..и будет изрядно тормознее нормальных ручных вычислений. :)
Так что у нас с нормальными ручными вычислениями?  :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: andrew.k от Январь 17, 2012, 18:45
..и будет изрядно тормознее нормальных ручных вычислений. :)
Так что у нас с нормальными ручными вычислениями?  :)
Задача еще не решена что ли?


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 17, 2012, 19:51
Задача еще не решена что ли?
Нет, вот жду прынца (на белом коне) который мне решит  :)

Хотелось бы увидеть хорошую технику программирования - но, увы, пока только "воспоминания о будущем" (QRegion) + Ваш огрызок из гугла (который непонятно к чему).


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Tonal от Январь 18, 2012, 10:31
Да лехко:
Код
Haskell
-- Типы данных и их синонимы
import Data.List
 
data Point = Point {getx, gety :: Float}
type Octagon = [Point]
type RelID = Float
 
-- Определяем Epsilon
epsilon = 1e-6
 
-- Вспомогательные простейшие функции
sign :: Float -> Int
getAngle :: Point -> Float
getDistPnt :: Point -> Point -> Float
calcPntRelID :: Point -> Point -> RelID
calcSectRelID :: (Point, Point) -> Point -> RelID
 
 
calcRelID :: Octagon -> Point -> RelID
calcRelID oct pnt
 | getDistPnt (Point 0 0) pnt < epsilon = 0
 | anglePnt2Corner beg < epsilon = calcPntRelID beg pnt
 | otherwise = calcSectRelID (beg, end) pnt
 where
   pnt_angle = getAngle pnt
   anglePnt2Corner corn = abs (pnt_angle - getAngle corn)
   cmpByAngleNear apnt bpnt =
     compare (anglePnt2Corner apnt) $ anglePnt2Corner bpnt
   nearestCorns = sortBy cmpByAngleNear oct
   beg = head nearestCorns
   begAngle = sign (pnt_angle - getAngle beg)
   testSign x = sign (pnt_angle - getAngle x) /= begAngle
   end = head . dropWhile testSign . tail $ nearestCorns
 
sign x = undefined
getAngle pnt = undefined
getDistPnt apnt bpnt = undefined
calcPntRelID apnt bpnt = undefined
calcSectRelID (beg, end) pnt = undefined
 
Надеюсь простейшие функции сам реализуеш. :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 19, 2012, 14:29
Надеюсь простейшие функции сам реализуеш. :)
Та я даже не знаю на каком вражеском языке Вы все это написали :)  Можно на "С", в крайнем случае на С++ ? Спасибо


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Tonal от Январь 19, 2012, 15:45
Там жа сверху написано: Haskell.
Вроде всё вполне тривиально. Сложностей никаких не использовал, за ненадобностью. :)
Но на С++ переводить - лениво. Слишком много кода получается.
Так что сам тренируйся. :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: andrew.k от Январь 19, 2012, 16:05
Там жа сверху написано: Haskell.
Вроде всё вполне тривиально. Сложностей никаких не использовал, за ненадобностью. :)
Но на С++ переводить - лениво. Слишком много кода получается.
Так что сам тренируйся. :)
Уже ведь сказано было, что нужно на блюдечке)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 19, 2012, 16:27
Там жа сверху написано: Haskell.
То есть Вы считаете что для решения такой задачи необходимо привлекать специализированный язык (со всеми вытекающими)? Смело однако
Но на С++ переводить - лениво. Слишком много кода получается.
Так что сам тренируйся. :)
А, ну понятно - эрудиту интересно изучать, но не делать  :)

Уже ведь сказано было, что нужно на блюдечке)
Ну а почему бы и нет? Qt классы у Вас есть, в чем загвоздка?


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: mutineer от Январь 19, 2012, 16:30
То есть Вы считаете что для решения такой задачи необходимо привлекать специализированный язык (со всеми вытекающими)? Смело однако

Хаскель специализированный? На чем? Язык общего назначения же


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Tonal от Январь 20, 2012, 11:43
На Haskell-е алгоритм выразился наиболее абстрактно, компактно и понятно.
А вот перевод в С/С++ - это уже довольно много не вполне очевидного кода.
К тому же для оптимальности его ещё следует затачить/подогнать под окружение.
Понятно, что всё это требует много времени и знания окружения.
У меня нет ни первого ни второго. Да и интереса большого к этому нет.
Так что пусть этим занимается тот, кому это зачем-то нужно. :)

П. С. По поводу языков - ИМХО профессиональный программист должен уметь читать/понимать основные языки программирования разных направлений и большинство языков в основном для него направлении.

П. П. С. По поводу классов Qt. Для подобных задачь лучше таки использовать специализированные библиотеки векторной графики, например AGG, или писать своё. У Qt несколько другие задачи, поэтому соответствующие классы, входящие в её состав заточены под её нужды и несколько тяжелы/неуклюжи в этой области. :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 20, 2012, 15:58
На Haskell-е алгоритм выразился наиболее абстрактно, компактно и понятно.
А вот перевод в С/С++ - это уже довольно много не вполне очевидного кода.
Странно.. а у меня почему-то на простом С получилось заметно короче чем на козырном языке  :).

А вообще Ваши посты прочитал с удовольствием. Заливаете Вы умело, творчески  :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Tonal от Январь 21, 2012, 09:11
Странно.. а у меня почему-то на простом С получилось заметно короче чем на козырном языке  :).
И чего ты тогда здесь плачишся и конючишь код, ежели уже написал?
А, на счёт краткости - выкладывай - сравним. :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 21, 2012, 13:32
И чего ты тогда здесь плачишся и конючишь код,
Неправда, я предложил обсудить как написать это место короче и с лучшей скоростью выполнения  (см пост #10)

А, на счёт краткости - выкладывай - сравним. :)
Охотно выложу свой как только увижу хоть какой-то другой, а иначе "выборы из одного кандидата" :) 


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Tonal от Январь 23, 2012, 08:30
И чего ты тогда здесь плачишся и конючишь код,
Неправда, я предложил обсудить как написать это место короче и с лучшей скоростью выполнения  (см пост #10)
Десятый пост (http://www.prog.org.ru/index.php?topic=20586.msg140532#msg140532) в этом топике написал kambala.
После него есть твой, с предложением обсудить как это сделать, а после:
Задача еще не решена что ли?
Нет, вот жду прынца (на белом коне) который мне решит  :)
Из которого следует, что решения и кода у тебя нет.
В следующем посте (http://www.prog.org.ru/index.php?topic=20586.msg141218#msg141218) ты всё ещё канючишь, или это уже «предложил обсудить...»?
И только в предпоследнем сообщении (http://www.prog.org.ru/index.php?topic=20586.msg141372#msg141372) сознаёшся что код у тебя таки есть, но опять же никаких предложений обсудить «краткость и скорость» там нет.
Есть они в следующем моём посте.

«Мне кажется, кто-то врёт» © Сова.
А, на счёт краткости - выкладывай - сравним. :)
Охотно выложу свой как только увижу хоть какой-то другой, а иначе "выборы из одного кандидата" :) 
Свой код я выложил. Там не достаёт только примитивных функций и примера вызова.
Так что выборы таки из 2х. Ты же утверждаешь (http://www.prog.org.ru/index.php?topic=20586.msg141372#msg141372) что «у меня почему-то на простом С получилось заметно короче».
Вот давай и сравним размеры, а то опять какое-то голословное утверждение с твоей стороны.
Так и репутацию троля получить не долго. :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Igors от Январь 23, 2012, 09:33
Свой код я выложил.
Ваш код за рамками обсуждения. Вовлекать в С++ проект  др язык для решения задачи типа "лаба первокурсника" - это просто шутка, не более того. Так что выкладываем реализацию на С/C++ а не прячемся за огромный багаж знаний  :)

«Мне кажется, кто-то врёт» © Сова.
Если © то наверное правильно "Сава"  :)


Название: Re: Относительное расстояние до центра 8-угольника
Отправлено: Tonal от Январь 23, 2012, 11:19
Свой код я выложил.
Ваш код за рамками обсуждения. Вовлекать в С++ проект  др язык для решения задачи типа "лаба первокурсника" - это просто шутка, не более того. Так что выкладываем реализацию на С/C++ а не прячемся за огромный багаж знаний  :)
До того, как я код выложил, никаких ограничений на язык не было озвучено. Так что мой код вполне в рамках обсуждения. :)

Кроме того, ты утверждал (http://www.prog.org.ru/index.php?topic=20586.msg141372#msg141372) что «у меня почему-то на простом С получилось заметно короче чем на козырном языке».
Вот я и прошу код - посмотреть на сиё чудо. :)

Иначе считаем утверждение голословными.
Ну и к автору высказывания понятно какое отношение. :)

«Мне кажется, кто-то врёт» © Сова.
Если © то наверное правильно "Сава"  :)
Тут согласен, уел. :)