| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Радиальное заполнение точками произвольного прямоу |
| Автор: VyachNik 19.2.2012, 19:09 |
| Доброго времени суток! Помогите, пожалуйста, с решением задачи: Дан произвольный прямоугольник со сторонами х=n, y=m. Левая верхняя точка прямоугольника имеет координаты х=0, у=0, а правая нижняя точка - х=n, y=m. Возьмем произвольную точку на прямоугольнике, например, х=n/2, y=m/2. Для удобства обозначим n/2=i, m/2=j. Требуется радиально заполнить прямоугольник точками от точки х=n/2, y=m/2 к краям прямоугольника, оптимизировать алгоритм заполнения таким образом, чтобы код был наименьшим. Например, заполнение точками может происходить так: 01. x=i y=j (i=n/2, j=m/2) 02. x=i+1 y=j 03. x=i+1 y=j+1 04. x=i y=j+1 05. x=i-1 y=j+1 06. x=i-1 y=j 07. x=i-1 y=j-1 08. x=i y=j-1 09. x=i+1 y=j-1 10. x=i+2 y=j-1 11. x=i+2 y=j 12. x=i+2 y=j+1 13. x=i+2 y=j+2 14. x=i+1 y=j+2 15. x=i y=j+2 16. x=i-1 y=j+2 17. x=i-2 y=j+2 18. x=i-2 y=j+1 19. x=i-2 y=j 20. x=i-2 y=j-1 21. x=i-2 y=j-2 22. x=i-1 y=j-2 23. x=i y=j-2 24. x=i+1 y=j-2 25. x=i+2 y=j-2 26. x=i+3 y=j-2 и т.д. |
| Автор: RomanEEP 20.2.2012, 16:29 |
| Можно заполнять прямоугольник горизонтальными линиями. Допустим c1 - цвет центра, с2 - цвет вершин. R - половина диагонали. Тогда цвет каждой точки считаем по формуле c = c1 + (c2 - c1)*r/R, где r- расстояние от центра прямоугольника до данной точки или c = c1 + (c2 - c1)*sqrt(x*x+y*y)/R Для заполнения каждой строки y считаем 2 коэффициента m = (c2-c1)/R; n = y*y, тогда цвет каждой точки линии считаем по формуле с = с1+m*sqrt(x*x+n) - по этой формуле считаем все 3 или 4 компонента цвета и рисуем линию слева направо. Для оптимизации можно по такому алгоритму заполнить только четверть прямоугольника и скопировать остальные части симметрично |
| Автор: Чучмек 20.2.2012, 18:37 | ||
|
| Автор: VyachNik 20.2.2012, 21:49 | ||||
за приведенный код большое спасибо, только некоторые моменты не совсем понятны, немогли бы вы немного разжевать, что к чему? какая переменная за что отвечает? скопировать код и проверить его на работоспособность большого труда не составит, а вот разобраться, что к чему... главное понять суть... если не затруднит... плиз... |
| Автор: Чучмек 20.2.2012, 22:07 |
| Идем по кругу, с каждым оборотом увеличиваем радиус. Шаг радиуса dr Шаг поворота df (вот здесь завтык , должно быть df:=k/r; а не df:=k/(f*r); dr=0.6 df=0.9/r Если сделать больше - будут не зарисованные точки |
| Автор: RomanEEP 21.2.2012, 13:16 | ||
|
| Автор: RomanEEP 21.2.2012, 15:29 | ||
Более быстрая альтернатива на скайлайне:
|
| Автор: Чучмек 21.2.2012, 21:18 |
| RomanEEP, Это принципиально разные вещи - градиент и радиальное заполнение. |