Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
flatgad
geJI<|>eP
186 / 186 / 18
Регистрация: 22.07.2010
Сообщений: 733
#1

Куча линий.

28.09.2010, 01:19. Просмотров 879. Ответов 4
Метки нет (Все метки)

Привет всем. Попытаюсь изложить суть своего вопроса. У меня каждую секунду рисуется около 100 линий (рисую через canvas) линии могут накладываться друг на друга но не пересекаться, лини выходят из одной точки. Вопрос таков можно ли как то сделать что бы к примеру после того как отрисовалось 10 линий рисовалась 11 но 1-я стиралась ? Исходники не надо если можно то лучше алгоритм как это можно решить. Скорость алгоритма очень нужна. Может можно и не через канвас, тогда буду рад услышать альтернативы. Заранее всем откликнувшимся спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2010, 01:19
Ответы с готовыми решениями:

Вывод линий
Всем привет! Дайте пожайлуста исходник Delphi вывода линий на экран или линии....

Распознание линий
Программисты помогите мне решить такую проблему, я сделал небольшую программу...

Массив линий
Все доброго дня, возни такой вопрос, как мне создать массив линий? к примеру...

OpenGL наложение линий
Добрый день. Нужна помощь специалистов по OpenGl. На 2d-плоскости...

Прорисовка и удаление линий
Нужна помощь!!! создаю несколько динамических объектов (TButton), между ними...

4
snake32
1649 / 1102 / 193
Регистрация: 26.02.2009
Сообщений: 4,088
Записей в блоге: 5
28.09.2010, 03:11 #2
Цитата Сообщение от flatgad Посмотреть сообщение
Вопрос таков можно ли как то сделать что бы к примеру после того как отрисовалось 10 линий рисовалась 11 но 1-я стиралась ?
поверх первой линии рисуете ещё одну с цветом фона, но это сработает если фон всегда однотонный.
Цитата Сообщение от flatgad Посмотреть сообщение
Скорость алгоритма очень нужна. Может можно и не через канвас, тогда буду рад услышать альтернативы.
DirectX, OpenGL
1
Viper27
5 / 5 / 1
Регистрация: 01.01.2011
Сообщений: 147
11.01.2011, 14:13 #3
Про закрашивание цветом фона вы не поняли... Человек хотел удалять линию для повышения производительности, а так отрисовывается ещё больше
1
snake32
1649 / 1102 / 193
Регистрация: 26.02.2009
Сообщений: 4,088
Записей в блоге: 5
11.01.2011, 15:05 #4
Цитата Сообщение от Viper27 Посмотреть сообщение
Про закрашивание цветом фона вы не поняли... Человек хотел удалять линию для повышения производительности, а так отрисовывается ещё больше
Отрисовывается больше на ОДНУ линию, чем если бы линии вообще не стирались. Это много? Хорошо, Viper27, предложите более производительный вариант через канву с однотонным фоном.
1
flatgad
geJI<|>eP
186 / 186 / 18
Регистрация: 22.07.2010
Сообщений: 733
12.01.2011, 11:23  [ТС] #5
Цитата Сообщение от snake32 Посмотреть сообщение
Отрисовывается больше на ОДНУ линию, чем если бы линии вообще не стирались. Это много? Хорошо, Viper27, предложите более производительный вариант через канву с однотонным фоном.
Всем спасибо за ответы проблема решена с помощью OpenGL. Кому надо алгоритм таков:
1. Записывается координаты n линий в список.
2. Рисуем на форме
3. Удаляем из списка координаты 1-й линию и добавляем координаты следующей.
4. Перерисовываем заданный список. Тем самым обновляем экран. и получается красивая картинка.

Вот немного кода:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  Lines:TList;
//Список где хранятся координаты
type
PVec2f = ^TVec2f;
TVec2f = packed record
x,y:GLfloat;
end;
....
//Инициализация OpenGL
DC:=GetDC(Form1.Panel1.Handle);
RC:=CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
ActivateRenderingContext(DC, RC);
glBlendFunc(GL_SRC_Alpha, gl_one);
...
//Добавление координат линии в список
New(p);
p.x := (0.9)*cos(pi*(angle)/180);
p.y := (0.9)*sin(pi*(angle)/180);
Lines.Add(p);
..
//Отрисовка линий
procedure TForm1.brush_openGL();
var m:integer;
value_sig1,value_sig2,value_sig3,value_sig4:Single;
R, G, B : GLFloat;
begin
glClear(GL_COLOR_BUFFER_BIT);
 glDisable(GL_BLEND);
 brash_diag_openGL();
 glLineWidth(3);
 glBegin (GL_LINES);
  glColor3d(1.0,1.0,1.0);
   value_sig1:=StrToFloat(Form1.sEdit9.text)/255;
   glVertex2f(0,0);
   glVertex2f( 0 , value_sig1 );
   value_sig2:=StrToFloat(Form1.sEdit10.text)/255;
   glVertex2f(0,0);
   glVertex2f( value_sig2 , 0  );
   value_sig3:=StrToFloat(Form1.sEdit11.text)/255;
   glVertex2f(0,0);
   glVertex2f( 0 , -value_sig3  );
   value_sig4:=StrToFloat(Form1.sEdit12.text)/255;
   glVertex2f(0,0);
   glVertex2f( -value_sig4 ,0  );
  glEnd;
  if (kol_OpenGL>16*sEdit8.Tag-1) and (sCheckBox2.Checked=False) then begin  
   //16*sEdit8.Tag-1  количество линий
    color_list.Delete(0);
    lines.Delete(0);
    kol_OpenGL:=kol_OpenGL-1;
  end;
  if Lines.Count>1 then begin
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  glLineWidth(1);
  glLineWidth(1.8);
  glBegin (GL_LINES);
  for m:=0 to Lines.Count-1 do
  begin
   ColorToGL (StringToColor('c'+color_list.ValueFromIndex[m]), R, G, B);
   glColor3d(R-0.5,G-0.5,B-0.5);
   glVertex2f(0,0);
   glVertex2fv(Lines.Items[m]);
  end;
glEnd;
end;
brash_freq_text();
swapbuffers(dc);
end;
0
12.01.2011, 11:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2011, 11:23

Рисование линий в Canvas
Как обработать MouseMove чтобы на форме отображались две пересекающиеся прямые(...

Point, тип линий
Доброе время суток, Форумчане! Подтолкните пожалуйста барана по нужной...

Изменить толщину линий в Chart-е
Здравствуйте. Как можно изменить толщину линий на график Editing Chart1 на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru