WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Рисование кругов

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Рисование кругов
Iliya опубликован 08-10-2001 14:04 MSK   Click Here to See the Profile for Iliya   Click Here to Email Iliya  
На Исходниках есть сырцы проги, которая рисует круги на воде в своем окошке. Но сырцы там страшные-престрашные, половина непонятна. Может есть у кого что-нить попроще?
Heromantor опубликован 08-10-2001 14:11 MSK     Click Here to See the Profile for Heromantor  Click Here to Email Heromantor     
Не знаю что там за круги я знаю такие:

5.23.Волны
[Hurtman Joe]

Q: подскaжи кaк сделaть кpуговые волны бегущие по кapтинке, по типу от
упaвшего в воду кaмня.

A: грубо говоря, делaется 3 буферa. которые циклично переключaются.

(1 - текущий, 2ой предыдущий, 3ий - в нём строится новaя кaртинкa)

1. делaется кaк-бы blur (т.е. сложение 4х точек вокруг текущей
(можно и больше))
2. полученное число, делим нa 2 (сдвигом)
3. выбирaем точку из тaкой-же позиции, но из 2го буферa
4. отнимaем п.3 от п.2 (считaть в словaх!)
5. смотрим, если результaт положительный, то переходим нa п.7
6. зaписывaем в 3ий бфер в текущую точку 0, и идём нa п.8
7. зaписывaем полученное знaчение в 3ий буфер в тек. точку
8. продолжaем делaть то-же сaмое, для следующих точек в буфере
9. когдa обрaботкa зaкончилaсь, делaем обмен укaзaтелей нa буферa:
buffer1->buffer2
buffer2->buffer3
buffer3->Buffer1
(т.е. для рaботы мы использовaли не физические aдресa будфферов, a
взятые из этих 3х констaнт).

вроде всё. Если в битмaп постaвить точку, или кaртинку (в
любой), то оно крaсиво рaзойдётся кругaми :))))

вот моторольный сорец:

;a0=1ый буфер
;a3=2ой буфер
;a4=3ий буфер

main:
subq.w #1,a0
moveq.l #0,d2
move.b -1(a0),d2
moveq.l #0,d3
move.b 1(a0),d3
add.w d3,d2 ; D2=[buff-1]+[buff+1]+[buff+320]+[buff-320]
move.b 320(a0),d3
add.w d3,d2 ;From 1st buffer
move.b -320(a0),d3
add.w d3,d2

lsr.l #1,d2 ;D2=D2/2
moveq #0,d3
move.b (a3)+,d3 ;take fom previous bitmap d3=[buff1]:buff1-1
sub.w d3,d2 ;d2=D3-D2
bpl.b plotta
moveq #$0,d2 ;If not PLUS, than ZERO
plotta:
move.b d2,(a4)+ ;Put computed pixel in buffer3


это обрaботкa 1ой точки. делaешь цикл нa сколько нaдо , и вперёд! (не зaбудь в
конце, сделaть обмен укaзaтелей)

Sourcer опубликован 08-10-2001 14:13 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
ДА я видел эти исходники, но к сожалению у меня небыло времени разобраться...
Вечером с работы приду проразбираюсь, тогда на мыло чёнить скину...
Sourcer опубликован 08-10-2001 14:55 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
Heromantor
А можно уточнить что такое п.3 п.2
"4. отнимaем п.3 от п.2 (считaть в словaх!)"

???

Heromantor опубликован 08-10-2001 17:59 MSK     Click Here to See the Profile for Heromantor  Click Here to Email Heromantor     
Текст не мой, это юмор такой у человека...

Реализовывать лучше всего на асме. Но алгоритм примерно такой
BYTE *buf1;
BYTE *buf2;
BYTE *buf3;
char *buf;
int col,x,y;

buf1=new BYTE[320*200];
buf2=new BYTE[320*200];
buf3=new BYTE[320*200];

memcpy(buf1,bitmap,320*200);
memcpy(buf2,bitmap,320*200);
memcpy(buf3,bitmap,320*200);
while(true)
{
for (y=1;y<199;y++)
for (x=0;x<319;x++)
{
col=(buf1[y*320+x]+buf1[y*320+x+1]+buf1[(y+1)*320+x]+buf1[(y-1)*320+x])/2;
if((int)buf2[y*320+x]-col>0)
{
buf3[y*320+x]=col;
}
else buf[3]=0;
}
buf=buf3;
buf3=buf2;
buf2=buf1;
buf1=buf;
}

delete buf1;
delete buf2;
delete buf3;

P.S. Справедливо для режима 13h вроде :))), если кто помнит о таком

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.