Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Градиентная заливка треугольника. 
:(
    Опции темы
nnvz
  Дата 21.2.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

user posted image

Нужно реализовать это безо всяких сторонних библиотек вроде OpenGL.
PM MAIL   Вверх
maxim1000
Дата 21.2.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а что именно интересует: вычисление цвета точки или способ рисования этих точек?


--------------------
qqq
PM WWW   Вверх
nnvz
Дата 21.2.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Именно вычисление цвета, куда выводить и как - неважно
PM MAIL   Вверх
maxim1000
Дата 21.2.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну, из того, что я увидел, можно придумать такое:
1. проводим медиану из левой точки
2. верхний треугольник закрашиваем градиентом от верхней угловой точки до левой
3. нижний - от нижней до левой

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


--------------------
qqq
PM WWW   Вверх
MBo
Дата 21.2.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Даны три точки A,B,C. Введем непрямоугольную систему координат с началом в точке A и базовыми векторами i=(B-A) и j=(C-A).
Для точки D внутри треугольника найдем параметрические координаты s и t из векторного соотношения
D-A = s*i +t*j, расписав его по координатам X и Y.
Цвет в точке D будет линейной комбинацией цветов вершин с весами A (1-s-t) B(s) C(t)
s и t лежат в пределах 0..1, и их сумма не превышает 1. Например, середина стороны BC имеет координаты 1/2, 1/2 и цвет - среднее B и С
Пример на Дельфи. Регион введен для простоты проверки.
сдвиги на 8 влево-вправо - чтобы работать в целочисленной арифметике.

Отмечу, что в Windows GDI есть функция GradientFill, которая умеет рисовать подобные вещи.

Код

var
  V: array[0..2] of TPoint;
  dx, dy, Denom, sa, ta: Integer;
  R, G, B: array[0..2] of Byte;
  hr: HRgn;
  s, t: Integer;
  rr, gg, bb: Byte;
begin
  V[0] := Point(100, 20);
  V[1] := Point(300, 80);
  V[2] := Point(150, 250);
  R[0] := 255;
  G[0] := 0;
  B[0] := 0;
  R[1] := 0;
  G[1] := 255;
  B[1] := 0;
  R[2] := 0;
  G[2] := 0;
  B[2] := 255;
  hr := CreatePolygonRgn(V, 3, ALTERNATE);
  Denom := V[2].x * (V[0].y - V[1].y) + V[0].x * (V[1].y - V[2].y) + V[1].x *  (V[2].y - V[0].y);
  sa := V[2].x * V[0].y - V[2].y * V[0].x;
  ta := V[0].x * V[1].y - V[0].y * V[1].x;
  for dy := 20 to 250 do
    for dx := 100 to 300 do
      if PtInRegion(hr, dx, dy) then begin
        s := (sa + dy * (V[0].x - V[2].x) + dx * (V[2].y - V[0].y)) shl 8 div  Denom;
        t := (ta + dy * (V[1].x - V[0].x) + dx * (V[0].y - V[1].y)) shl 8 div   Denom;
        rr := (R[0] * (255 - s - t) + R[1] * S + R[2] * t) shr 8;
        gg := (G[0] * (255 - s - t) + G[1] * S + G[2] * t) shr 8;
        bb := (B[0] * (255 - s - t) + B[1] * S + B[2] * t) shr 8;
        Canvas.Pixels[dx, dy] := RGB(rr, gg, bb);
      end;
  DeleteObject(hr);
end;


Это сообщение отредактировал(а) MBo - 21.2.2006, 17:44

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  shot.jpg 4,13 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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