Russian Qt Forum
Ноябрь 23, 2024, 03:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Задача на технику  (Прочитано 4237 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Май 29, 2013, 17:27 »

Добрый день

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

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

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

Удачи  Улыбающийся

 
Записан
SimpleSunny
Гость
« Ответ #1 : Май 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);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 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). Однако можно использовать любые структуры данных по своему вкусу
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Май 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 достаточно быстрая?
Записан
Bepec
Гость
« Ответ #4 : Май 30, 2013, 10:50 »

Мнение неспециалиста - если нет ограничений по красивости, то заливать все замкнутые зоны. В конце концов у нас останется контур залитый цветом. Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 30, 2013, 10:55 »

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 30, 2013, 10:58 »

Мнение неспециалиста - если нет ограничений по красивости, то заливать все замкнутые зоны. В конце концов у нас останется контур залитый цветом. Веселый
Так возни много с пикселями, да и объекты могут находиться один за другим или вообще пересекаться.
Записан
Bepec
Гость
« Ответ #7 : Май 30, 2013, 11:00 »

Таки возни не особо много, объекты один за одним - кому это мешает? Улыбающийся Нам нужен контур.

PS другой вопрос, если вы забыли добавить в условие, что будут иметься незамкнутые или "дырчатые" контуры.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Май 30, 2013, 11:08 »

Таки возни не особо много, объекты один за одним - кому это мешает? Улыбающийся Нам нужен контур.

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

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июнь 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 и.т.п. А также прибит к позорному столбу за незнание буста, неуменме найти и.т.п.

Прошу исполнить  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.226 секунд. Запросов: 23.