Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Май 29, 2013, 17:27



Название: Задача на технику
Отправлено: Igors от Май 29, 2013, 17:27
Добрый день

Тут разговор зашел о технике программирования, насколько важно уметь владеть тем или иным, и все такое. В принципе это нормально, но не хватает конкретики. Попробуем на более живом примере.

Есть фигуры: напр плоскость и сфера, состоят из точек и треугольников (первый аттач).
Надо: нарисовать силуэты этих же фигур (второй аттач)

Вывод на экран производится ф-цией (полагаем что она уже есть)
Код
C++ (Qt)
void DrawLine( float x1, float y1, float x2, float y2 );
 
Можно: использовать все что угодно, любые тулзы, любой формат исходных данных по своему вкусу, лишь бы вывод сводился к DrawLine.

Удачи  :)

 


Название: Re: Задача на технику
Отправлено: SimpleSunny от Май 29, 2013, 21:24
Вы бы ограничения посущественней наложили, а то можно просто

Код
C++ (Qt)
for (int i = 0; i < fig.size - 1; ++i)
   DrawLine(fig.pos[i].x, fig.pos[i].y, fig.pos[i + 1].x, fig.pos[i + 1].y);


Название: Re: Задача на технику
Отправлено: Igors от Май 30, 2013, 08:09
Вы бы ограничения посущественней наложили, а то можно просто

Код
C++ (Qt)
for (int i = 0; i < fig.size - 1; ++i)
   DrawLine(fig.pos[i].x, fig.pos[i].y, fig.pos[i + 1].x, fig.pos[i + 1].y);
Ну так нарисуется "каша-мала", никто не обещал что точки следуют в каком-то определенном порядке. Нарисовать первую картинку можно напр так
Код
C++ (Qt)
for (size_t i = 0; i < obj.tri.size(); ++i) {
  const Point & p0 = obj.point[tri[i][0]];
  const Point & p1 = obj.point[tri[i][1]];
  const Point & p2 = obj.point[tri[i][2]];
  DrawLine(p0.x, p0.y, p1.x, p1.y);
  DrawLine(p1.x, p1.y, p2.x, p2.y);
  DrawLine(p2.x, p2.y, p0.x, p0.y);
}
 
Здесь объект obj имеет контейнеры точек (point) и треугольников (tri). Однако можно использовать любые структуры данных по своему вкусу


Название: Re: Задача на технику
Отправлено: Авварон от Май 30, 2013, 10:39
Вы бы ограничения посущественней наложили, а то можно просто

Код
C++ (Qt)
for (int i = 0; i < fig.size - 1; ++i)
   DrawLine(fig.pos[i].x, fig.pos[i].y, fig.pos[i + 1].x, fig.pos[i + 1].y);
Ну так нарисуется "каша-мала", никто не обещал что точки следуют в каком-то определенном порядке. Нарисовать первую картинку можно напр так
Код
C++ (Qt)
for (size_t i = 0; i < obj.tri.size(); ++i) {
  const Point & p0 = obj.point[tri[i][0]];
  const Point & p1 = obj.point[tri[i][1]];
  const Point & p2 = obj.point[tri[i][2]];
  DrawLine(p0.x, p0.y, p1.x, p1.y);
  DrawLine(p1.x, p1.y, p2.x, p2.y);
  DrawLine(p2.x, p2.y, p0.x, p0.y);
}
 
Здесь объект obj имеет контейнеры точек (point) и треугольников (tri). Однако можно использовать любые структуры данных по своему вкусу


Типа вы ща намекаете на то, что некоторые линии будут рисоваться дважы (на стыке треугольников)? :) Не претендую на "знатока", ибо думать и писать своё решение лень, но изъны в чужих решениях поищу :)

А вот доустим вопрос - наксолько медленная ф-ия рисования? Если я заведу хэш и буду в него складывать координаты линий, а потом по нему пробегусь - это будет быстрее, или "овчинка выделки не стоит" и DrawLine достаточно быстрая?


Название: Re: Задача на технику
Отправлено: Bepec от Май 30, 2013, 10:50
Мнение неспециалиста - если нет ограничений по красивости, то заливать все замкнутые зоны. В конце концов у нас останется контур залитый цветом. :D


Название: Re: Задача на технику
Отправлено: Igors от Май 30, 2013, 10:55
Типа вы ща намекаете на то, что некоторые линии будут рисоваться дважы (на стыке треугольников)? :) Не претендую на "знатока", ибо думать и писать своё решение лень, но изъны в чужих решениях поищу :)

А вот доустим вопрос - наксолько медленная ф-ия рисования? Если я заведу хэш и буду в него складывать координаты линий, а потом по нему пробегусь - это будет быстрее, или "овчинка выделки не стоит" и DrawLine достаточно быстрая?
Задача - нарисовать силуэт, при этом рисовать одну линию дважды не запрещено. Ну а если оптимизировать - то чего же бегать с хешем на каждом рисовании? Тогда уж подготовить все пинии один раз.


Название: Re: Задача на технику
Отправлено: Igors от Май 30, 2013, 10:58
Мнение неспециалиста - если нет ограничений по красивости, то заливать все замкнутые зоны. В конце концов у нас останется контур залитый цветом. :D
Так возни много с пикселями, да и объекты могут находиться один за другим или вообще пересекаться.


Название: Re: Задача на технику
Отправлено: Bepec от Май 30, 2013, 11:00
Таки возни не особо много, объекты один за одним - кому это мешает? :) Нам нужен контур.

PS другой вопрос, если вы забыли добавить в условие, что будут иметься незамкнутые или "дырчатые" контуры.


Название: Re: Задача на технику
Отправлено: Igors от Май 30, 2013, 11:08
Таки возни не особо много, объекты один за одним - кому это мешает? :) Нам нужен контур.

PS другой вопрос, если вы забыли добавить в условие, что будут иметься незамкнутые или "дырчатые" контуры.
"дырчатые" входит в понятие "силуэт". "Незамкнутых" нет, все состоит из треугольников имеющих площадь. Поэтому силуэт может состоять из любого числа контуров, но все они замкнуты


Название: Re: Задача на технику
Отправлено: Igors от Июнь 01, 2013, 08:57
Однако ... неужели у всех также "плохо с графикой" как у Вереса?  :) Ведь какие линии рисовать - довольно очевидно.

Случай 1: (плоскость) если линия входит только в один треугольник
Случай 2: (сфера) если линия входит в 2 треугольника имеющих общую плошадь (перекрывающих друг друга на экране). Пример

triangle1(p0, p1, p2)
triangle2(p0, p1, p3)

Отрезок (p0, p1) должен быть отрисован для силуэта если p2 и p3 лежат по одну сторону прямой (p0, p1). Или, др словами, если направления обхода совпадают. Ладно, "даю формулы"
Код
C++ (Qt)
inline float Area( const Point & p0, const Point & p1, const Point & p2 )
{
return (p1.x - p0.x) * (p2.y - p1.y) - (p1.y - p0.y) * (p2.x - p1.x);
}
..
if (Area(p0, p1, p2) * Area(p0, p1, p3) > 0)
 DrawLine(p0.x, p0.y, p1.x, p1.y);
 
Ну все, дальше "дело техники", теперь я буду наверняка расстрелян с помощью С++ 11, std::bind и.т.п. А также прибит к позорному столбу за незнание буста, неуменме найти и.т.п.

Прошу исполнить  :)