Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Tronix
Зарегистрирован: 02.11.2011 Сообщения: 72
|
Добавлено: Чт Июл 26, 2012 17:27 Заголовок сообщения: twister или twisting bar |
|
|
Привет, если ли у кого свои сабжи на вменяемом языке программирования (си/паскаль) ? Хочется посмотреть алгос. |
|
Вернуться к началу |
|
 |
Tronix
Зарегистрирован: 02.11.2011 Сообщения: 72
|
Добавлено: Чт Июл 26, 2012 20:33 Заголовок сообщения: |
|
|
Хорошо, конкретизирую: вот беру алгоритм в лоб с амижной борды:
Код: | amp := 100;
For y := 1 to 270 do
Begin
x1 :=Trunc(Sin((y/amp)+ang)*50)+140;
x2 :=Trunc(Sin((y/amp)+ang+90)*50)+140;
x3 :=Trunc(Sin((y/amp)+ang+90*2)*50)+140;
x4 :=Trunc(Sin((y/amp)+ang+90*3)*50)+140;
If x1 < x2 then
Begin
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.MoveTo(x1,y);
Image1.Canvas.LineTo(x2,y);
End;
If x2 < x3 then
Begin
Image1.Canvas.Pen.Color := clRed;
Image1.Canvas.MoveTo(x2,y);
Image1.Canvas.LineTo(x3,y);
End;
If x3 < x4 then
Begin
Image1.Canvas.Pen.Color := clGreen;
Image1.Canvas.MoveTo(x3,y);
Image1.Canvas.LineTo(x4,y);
End;
If x4 < x1 then
Begin
Image1.Canvas.Pen.Color := clBlue;
Image1.Canvas.MoveTo(x4,y);
Image1.Canvas.LineTo(x1,y);
End;
End;
ang := ang + 0.1;
if ang = 360 then ang := 1; |
Вижу такую картинку:
И вижу, что как-бы четвертая грань (синяя) на ней выводится всего в пару линий толщиной. Что я делаю не так? |
|
Вернуться к началу |
|
 |
Tronix
Зарегистрирован: 02.11.2011 Сообщения: 72
|
Добавлено: Пт Июл 27, 2012 10:35 Заголовок сообщения: |
|
|
Сам себе не ответишь, никто не ответит Забыл про перевод градусов в радианы. |
|
Вернуться к началу |
|
 |
keen
Зарегистрирован: 24.07.2011 Сообщения: 108 Откуда: Kiev/Ukraine
|
Добавлено: Пт Июл 27, 2012 14:07 Заголовок сообщения: |
|
|
Tronix писал(а): | Сам себе не ответишь, никто не ответит Забыл про перевод градусов в радианы. |
кульно... а можешь весь исходник показать? |
|
Вернуться к началу |
|
 |
Tronix
Зарегистрирован: 02.11.2011 Сообщения: 72
|
Добавлено: Пт Июл 27, 2012 16:55 Заголовок сообщения: |
|
|
keen писал(а): | кульно... а можешь весь исходник показать? |
Да я как-бы на дельфе то его уже похерил. Смысл в том, что надо переводить угол в радианы, типа того:
Код: | x1 :=Trunc(Sin(((y/amp)+ang)*deg2rad)*60)+160; |
где rad2deg := pi/180.
Ну и ессно не в цикле всю эту хрень считать а построить табличку LUT.
Я кодил для платформы chip16: http://habrahabr.ru/post/146496/ на асме. Приложу конечно на всякий случай исходник на асме и скомпиленный в chip16 исполнимый файл. Можно скачать эмулятор http://code.google.com/p/refchip16/downloads/list и посмотреть на нем.
Вот исходник и .c16 файл: http://rghost.ru/39436571
 |
|
Вернуться к началу |
|
 |
bi71

Зарегистрирован: 14.07.2012 Сообщения: 871
|
|
Вернуться к началу |
|
 |
Tronix
Зарегистрирован: 02.11.2011 Сообщения: 72
|
Добавлено: Пн Июл 30, 2012 08:47 Заголовок сообщения: |
|
|
Почему мало? Все расписано нормально и понятно. Я бы реализовал щаз на раз два, токма задачи такой нет. Вот больше интересно про воксельный сабж, это вот я бы с удовольствием посмотрел алгоритм. |
|
Вернуться к началу |
|
 |
bi71

Зарегистрирован: 14.07.2012 Сообщения: 871
|
Добавлено: Пн Июл 30, 2012 11:57 Заголовок сообщения: |
|
|
Tronix писал(а): |
Почему мало? Все расписано нормально и понятно. Я бы реализовал щаз на раз два, токма задачи такой нет. Вот больше интересно про воксельный сабж, это вот я бы с удовольствием посмотрел алгоритм. |
не заметил. описание трудное, я темный
воксельный алгоритм вроде бы упоминался, есть исходники. кажется, я ссылку приводил.
если это воксели, конечно.. |
|
Вернуться к началу |
|
 |
Tronix
Зарегистрирован: 02.11.2011 Сообщения: 72
|
Добавлено: Пн Июл 30, 2012 20:40 Заголовок сообщения: |
|
|
bi71 писал(а): | не заметил. описание трудное, я темный
воксельный алгоритм вроде бы упоминался, есть исходники. кажется, я ссылку приводил. если это воксели, конечно.. |
А чего не ясно в тектурирование-то? Давай подскажу, попробуем накодить в си для win ce. Там просто все. А где про воксили рассказывали? Я примерно конечно понимаю как, но до конца мысль не сформировывается. |
|
Вернуться к началу |
|
 |
bi71

Зарегистрирован: 14.07.2012 Сообщения: 871
|
Добавлено: Вт Июл 31, 2012 07:22 Заголовок сообщения: |
|
|
Tronix писал(а): | bi71 писал(а): | не заметил. описание трудное, я темный
воксельный алгоритм вроде бы упоминался, есть исходники. кажется, я ссылку приводил. если это воксели, конечно.. |
А чего не ясно в тектурирование-то? Давай подскажу, попробуем накодить в си для win ce. Там просто все. А где про воксили рассказывали? Я примерно конечно понимаю как, но до конца мысль не сформировывается. |
http://demoscene.ru/forum/viewtopic.php?p=6922#6922
файл dna_dsrc.zip, где исходник на асме, если не ошибаюсь с комментариями.
что мне неясно в текстурировании? да просто алгоритм, пока оставил на потом, вернусь когда-нибудь. |
|
Вернуться к началу |
|
 |
BiTL DOS lover

Зарегистрирован: 22.09.2007 Сообщения: 2950
|
Добавлено: Ср Авг 01, 2012 15:39 Заголовок сообщения: |
|
|
В твистере текстурирование то простое. Нужен просто алгоритм текстурной прямой линии, самой элементарной, где y1 и y2 одинаковые. |
|
Вернуться к началу |
|
 |
Tronix
Зарегистрирован: 02.11.2011 Сообщения: 72
|
Добавлено: Пт Авг 03, 2012 18:01 Заголовок сообщения: |
|
|
BiTL писал(а): | В твистере текстурирование то простое. Нужен просто алгоритм текстурной прямой линии, самой элементарной, где y1 и y2 одинаковые. |
Имхо никакого алгоритма не нужно. Просто берешь точку в текущей позиции икса. Ща подпил конешно, так бы накодил, может потом. Там ваще делать нечего реально.
PS: Воксельные сорцы не понятны. Алгоритм бы узнать. |
|
Вернуться к началу |
|
 |
BiTL DOS lover

Зарегистрирован: 22.09.2007 Сообщения: 2950
|
Добавлено: Пт Авг 03, 2012 19:55 Заголовок сообщения: |
|
|
Tronix писал(а): | BiTL писал(а): | В твистере текстурирование то простое. Нужен просто алгоритм текстурной прямой линии, самой элементарной, где y1 и y2 одинаковые. |
Имхо никакого алгоритма не нужно. Просто берешь точку в текущей позиции икса. |
Так не получишь текстурированные грани, а получишь херню, закрашенную статичным фоном. Подумай Текстурированный отрезок должен "сжиматься" и "расширятся". |
|
Вернуться к началу |
|
 |
bi71

Зарегистрирован: 14.07.2012 Сообщения: 871
|
Добавлено: Сб Авг 04, 2012 08:33 Заголовок сообщения: |
|
|
http://insolitdust.sourceforge.net/code.html
insolit dust выложила исходники олдскульных эффектов, пусть там и xor, но разобраться с Twister'ом можно.
что-то с Паскалем фигня получается, вот тогда и будут вопросы.
на dbfinteractive есть рабочий исходник для PureBasic:
Код: |
; -------- small PB example by Mr.Vain/Secretly! aka Thorsten Will in 2007 --------
lScreenW = 640 ; Width
lScreenH = 480 ; Height
lScreenD = 32 ; Depth
lCenterX = lScreenW / 2
InitSprite()
OpenScreen( lScreenW, lScreenH, lScreenD, "Twist Experience by va!n")
; -------- Define Colors in an array --------
Dim aColor (4,3)
aColor(0,0) = 255 : aColor(0,1) = 0 : aColor(0,2) = 0
aColor(1,0) = 0 : aColor(1,1) = 0 : aColor(1,2) = 255
aColor(2,0) = 0 : aColor(2,1) = 255 : aColor(2,2) = 0
aColor(3,0) = 255 : aColor(3,1) = 255 : aColor(3,2) = 0
aColor(4,0) = aColor(0,0) : aColor(4,1) = aColor(0,1) : aColor(4,2) = aColor(0,2)
;-------- Define some Twist settings --------
ascale.f = 3.14/180
lTwistWidth = 100
inc.f = 1.0 ; drehungs start pos
iinc.f = 0.01 ; drehungs speed
a.f = 0.25
; -------- Mainloop --------
Repeat
ClearScreen($0)
StartDrawing(ScreenOutput())
; -------- Reset Values --------
a = 0
inc = inc + iinc
For y = 0 To lScreenH+Abs(inc)
x1 = lTwistWidth * (4+Abs(inc))/4 * Sin(a*ascale)
x2 = lTwistWidth * (4+Abs(inc))/4 * Cos(a*ascale)
x1 = Abs(x1)
x2 = Abs(x2)
q = Int(a/90)
If q & 1 <> 0
Swap x1,x2 ; t = x1 : x1 = x2 : x2 = t
EndIf
ow = lCenterX-((x1+x2)/2)
LineXY ( ow, y, ow+x1, y, RGB( aColor(q+1,0), aColor(q+1,1), aColor(q+1,2) ))
LineXY (ow+x1, y, ow+x1+x2, y, RGB( aColor(q ,0), aColor(q ,1), aColor(q ,2) ))
a = a + inc /2
If Int(a) <= 0 : a = a + 360 : EndIf
If Int(a) >= 360 : a = a - 360 : EndIf
Next
If inc > 2 Or inc < -2 : iinc = -iinc : EndIf
StopDrawing()
; -------- Lets the show start --------
FlipBuffers();1)
Delay(1)
Until GetAsyncKeyState_(#VK_ESCAPE)
End
; IDE Options = PureBasic 4.60 (Windows - x86)
; CursorPosition = 53
; EnableXP
|
|
|
Вернуться к началу |
|
 |
bi71

Зарегистрирован: 14.07.2012 Сообщения: 871
|
Добавлено: Сб Авг 04, 2012 11:26 Заголовок сообщения: |
|
|
еще один интересный вариант, спасибо вахтеру Shockwave:
Код: |
'
' Mister Twister Code Started 19:24pm 28/06/09 Finished 20:10 28/06/09
' Fast code, be kind :-) I know it's ugly :-p
' By Shockwave.
'
'===============================================================================
#INCLUDE "TINYPTC_EXT.BI"
#INCLUDE "WINDOWS.BI"
'-------------------------------------------------------------------------------
' SCREEN SETUP;
'-------------------------------------------------------------------------------
CONST XRES = 800
CONST YRES = 600
DIM SHARED AS INTEGER HALFX
DIM SHARED AS INTEGER HALFY
HALFX=XRES/2
DIM SHARED AS DOUBLE RAD2DEG
DIM SHARED AS DOUBLE RAD2DEG2
RAD2DEG =3.14/180
RAD2DEG2=3.14/180
'-------------------------------------------------------------------------------
' SET UP THE SCREEN.
'-------------------------------------------------------------------------------
DIM SHARED AS UINTEGER BUFFER ( XRES * YRES ): ' SCREEN BUFFER
DECLARE SUB TWISTER()
DECLARE SUB RENDERLINE(BYVAL YP AS INTEGER, BYVAL XP AS INTEGER, BYVAL SLICE AS INTEGER, BYVAL TC AS UINTEGER)
'-------------------------------------------------------------------------------
' SET UP THE SCREEN.
'-------------------------------------------------------------------------------
PTC_ALLOWCLOSE(0)
PTC_SETDIALOG(1,"WWW.DBFINTERACTIVE.COM"+CHR$(13)+"FULL SCREEN?",0,1)
IF (PTC_OPEN("Coded by Shockwave",XRES,YRES)=0) THEN
END-1
END IF
'-------------------------------------------------------------------------------
' MAIN LOOP
'-------------------------------------------------------------------------------
DIM SHARED AS DOUBLE OLD,DELTA,ADDMOVE
ADDMOVE=0.0
WHILE(GETASYNCKEYSTATE(VK_ESCAPE)<> -32767 and PTC_GETLEFTBUTTON=FALSE)
OLD=TIMER
TWISTER()
PTC_UPDATE@BUFFER(0)
SLEEP 1
ERASE BUFFER
DELTA=(TIMER-OLD)*150
ADDMOVE=ADDMOVE+DELTA
WEND
EXITPROCESS(0)
END
SUB TWISTER()
DIM AS INTEGER Y,X1,X2,X3,X4,X5,X6,X7,X8
DIM AS INTEGER PNR
DIM AS DOUBLE COUNTER,SV,PULSE
COUNTER=ADDMOVE
FOR Y=0 TO YRES-1
SV=149*SIN((Y-COUNTER)*(RAD2DEG*.3))
PULSE=110+60*SIN((Y+COUNTER)*RAD2DEG2*.15)
X1=HALFX+(PULSE*SIN((SV+COUNTER)*RAD2DEG))
X2=HALFX+(PULSE*SIN((SV+COUNTER+45)*RAD2DEG))
X3=HALFX+(PULSE*SIN((SV+COUNTER+90)*RAD2DEG))
X4=HALFX+(PULSE*SIN((SV+COUNTER+135)*RAD2DEG))
X5=HALFX+(PULSE*SIN((SV+COUNTER+180)*RAD2DEG))
X6=HALFX+(PULSE*SIN((SV+COUNTER+215)*RAD2DEG))
X7=HALFX+(PULSE*SIN((SV+COUNTER+260)*RAD2DEG))
X8=HALFX+(PULSE*SIN((SV+COUNTER+295)*RAD2DEG))
IF X2>X1 THEN
SLICE=X2-X1
RENDERLINE(Y,X1,SLICE,RGB(SLICE,SLICE*.5,SLICE*.2))
END IF
IF X3>X2 THEN
SLICE=X3-X2
RENDERLINE(Y,X2,SLICE,RGB(SLICE*.5,SLICE*.2,SLICE))
END IF
IF X4>X3 THEN
SLICE=X4-X3
RENDERLINE(Y,X3,SLICE,RGB(SLICE*.2,SLICE,SLICE*.5))
END IF
IF X5>X4 THEN
SLICE=X5-X4
RENDERLINE(Y,X4,SLICE,RGB(SLICE*.2,SLICE*.5,SLICE))
END IF
IF X6>X5 THEN
SLICE=X6-X5
RENDERLINE(Y,X5,SLICE,RGB(SLICE,SLICE*.5,SLICE*.2))
END IF
IF X7>X6 THEN
SLICE=X7-X6
RENDERLINE(Y,X6,SLICE,RGB(SLICE*.5,SLICE*.2,SLICE))
END IF
IF X8>X7 THEN
SLICE=X8-X7
RENDERLINE(Y,X7,SLICE,RGB(SLICE*.2,SLICE,SLICE*.5))
END IF
IF X1>X8 THEN
SLICE=X1-X8
RENDERLINE(Y,X8,SLICE,RGB(SLICE*.2,SLICE*.5,SLICE))
END IF
PNR+=XRES
COUNTER-=.035
NEXT
END SUB
SUB RENDERLINE(BYVAL YP AS INTEGER, BYVAL XP AS INTEGER, BYVAL SLICE AS INTEGER, BYVAL TC AS UINTEGER)
DIM AS UINTEGER PTR PP
PP=@BUFFER((YP*XRES)+XP)
asm
mov eax,dword ptr[TC]
mov ecx, [slice]
mov edi, [PP]
rep stosd
end asm
END SUB
|
интересно теперь с текстурой разобраться.. |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|