На самом деле не такая уж и сложная. Всё можно реализовать Брезенхемом (это только сложения и вычитания)
Конвертация XY в адрес вообще по табличке классической.
Раз ты любитель бейсика - можно асм-функцию забацать и вызывать её через FN как это рекомендовал Инфорком.
Возможно, будет интересен EOR Fill
EOR не пробовал.
Но вот что я уже забабахал на алгоритме, который предоставил Reobne:
Последний раз редактировалось ALKO; 07.07.2023 в 01:22.
Как ты так нарисовал? В каком-то векторном редакторе на ПиСи, потом экспортировал в треугольники и линии? Или всё на Спектруме? А программку на бейсике - откомпилировал?
Треугольники треугольниками, но в основном в этой картинке многоугольники.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Она и есть. Моя первая (и последняя) компьюторная любофб. Буратины из ПС1 не могли так впечатлить, как впечатлила в своё время дримка своими округлостями. Но тогда, гаде в 2001-ом, когда я впервые увидел сей божественный графин, я загорелся желанием таки засунуть полиговны в хз-спектрум (ибо дримки были разве что в игровых клубах, а в нашей нищей семейке лишь Горбатый на отечественных микросхемах).
И вот наконец-то воплощаю в жызнь давнюю мечту.
- - - Добавлено - - -
Состоящие из треугольников, как это сделано в любой современной игре.
- - - Добавлено - - -
За пару дней набросал свой редактор на SDL (возможно, применю его в отношении сеги и DOS ega|cga, а также для вуды на OpenGL 1.0.)
Ну вот ещё-бы вывод побыстрей.
Вот процедура с произвольной заливкой (кажется из 3Dlame) - прикрутить сумеешь наверное.
Скрытый текст
Код:DEVICE ZXSPECTRUM48 DISPLAY "END=", END STARTFORSNA EQU #8000 ORG STARTFORSNA DI LD SP,#8000 CALL DECRUN LD HL,#2020,DE,#90E0,BC,#10a5:CALL TRIUGOL:JR $ TRIUGOL ;[ рисовалка треугольников с текстурой ; HL=вершина1, DE=вершина2, BC=вершина3 LD (AAA),HL,(BBB),DE,(CCC),BC SORT ;[ сортировка пузырьковым методом LD B,2 SORT1 PUSH BC:LD B,2:LD IX,AAA SORT2 LD A,(IX+1):CP (IX+3):JP C,SORT3 LD H,(IX+3):LD L,(IX+2):LD C,(IX) LD (IX+3),A:LD (IX+2),C:LD (IX+1),H:LD (IX),L SORT3 INC IX,IX:DJNZ SORT2 POP BC:DJNZ SORT1 ;] LD HL,(BBB),DE,(AAA),LY,D LD A,H:CP D:JP Z,TRIU2 SUB D:LD C,A:EXA CALL CALK PUSH DE:EXX:POP DE:EXX LD HL,(CCC),DE,(AAA) LD A,H:SUB D:LD C,A CALL CALK PUSH DE:EXX:POP BC:EXX LD HL,(AAA),B,L,C,0:LD (CRD1+1),BC,(CRD2+1),BC CALL TRI3 EXA:LD B,A CALL TRI2 LD HL,(CCC),DE,(BBB) LD A,H:SUB D:LD C,A:EXA CALL CALK PUSH DE:EXX:POP DE:EXX TRIU1 EXA:OR A:RET Z:LD B,A:JP TRI2 TRIU2 LD HL,(CCC),DE,(AAA) LD A,H:SUB D:RET Z LD C,A:EXA CALL CALK PUSH DE:EXX:POP DE:EXX LD HL,(CCC),DE,(BBB) LD A,H:SUB D:LD C,A CALL CALK PUSH DE:EXX:POP BC:EXX LD HL,(AAA),DE,(BBB) LD B,L,C,0,(CRD1+1),BC LD B,E,(CRD2+1),BC CALL TRI3 JP TRIU1 LINEM LD A,LY:AND 7:PUSH HL L_TEXTU LD HL,(F_MASK),E,A,D,0:ADD HL,DE LD A,(HL) CPL ; CPL если нужна инверсия, NOP если не нужна POP HL:LD HY,A LD A,B:SUB C:JP NC,LINEM1 LD A,B:LD B,C:LD C,A LINEM1 LD A,C,D,#F8:AND D:RRA:RRA:RRA:ADD A,L:LD L,A LD A,C:AND D:LD E,A LD A,B:AND D:CP E JP NZ,LINEM3 LD A,C:AND 7:ADD A,low MASKA_A:LD E,A LD A,high MASKA_A:ADC A,0:LD D,A LD A,(DE) LD C,A LD A,B:AND 7:ADD A,8:ADD A,low MASKA_A:LD E,A:LD A,D:ADC A,0:LD D,A LD A,(DE):AND C:LD E,A:CPL:AND (HL) LD B,A:LD A,E:AND HY:OR B:LD (HL),A RET LINEM3 LD E,C LD A,C:AND D:LD C,A LD A,E:AND 7:ADD A,low MASKA_A:LD E,A LD A,high MASKA_A:ADC A,0:LD D,A LD A,(DE):LD E,A:CPL:AND (HL):LD (HL),A LD A,E:AND HY:OR (HL):LD (HL),A:INC L LD A,B:AND 7:ADD A,8:ADD A,low MASKA_A:LD E,A LD A,D:ADC A,0:LD D,A LD A,(DE):LD E,A LD A,B:AND #F8:SUB C:SUB 8:JP Z,LINEM4 RRA:RRA:RRA:LD B,A:LD A,HY LINEM5 LD (HL),A INC L:DJNZ LINEM5 LINEM4 LD A,E:CPL:AND (HL):LD B,A:LD A,E:AND HY:OR B:LD (HL),A ;** RET CALK LD B,0 LD A,L:SUB E:LD E,B:JP NC,CALK1 NEG:LD D,A:CALL DIV LD A,E:CPL:LD E,A LD A,D:CPL:LD D,A INC DE RET CALK1 LD D,A:JP DIV TRI2 PUSH BC:EXX CRD1 LD HL,0:ADD HL,DE:LD (CRD1+1),HL LD A,H:LD (TRI2_+1),A CRD2 LD HL,0:ADD HL,BC:LD (CRD2+1),HL LD A,H:EXX TRI2_ LD C,0:LD B,A:LD L,(IX):LD H,(IX+1) CALL LINEM INC LY:INC IX,IX POP BC:DJNZ TRI2 RET TRI3 LD L,H:LD H,0:LD BC,TSCRB:ADD HL,HL:ADD HL,BC:PUSH HL:POP IX RET ;] DIV ;[ DE = DE/BC с округлением ответа PUSH BC LD A,B:CPL:LD B,A LD A,C:CPL:LD C,A INC BC LD HL,0 LD A,E ADD A,A RL D DUP 16 ADC HL,HL ADD HL,BC JP C,$+5 SBC HL,BC RLA RL D EDUP LD E,A POP BC SRL B RR C OR A:SBC HL,BC:RET C INC DE RET ;] DECRUN ;[ делаем табличку адресов в экране LD DE,#4000:LD HL,TSCRB:LD B,#c0 DECR4 LD (HL),E:INC HL:LD (HL),D:INC HL:CALL DW_DE DECR5 DJNZ DECR4 DW_DE INC D:LD A,D:AND 7:RET NZ LD A,E:ADD A,32:LD E,A:RET C LD A,D:SUB 8:LD D,A RET ;] ;[ AAA DW 0 BBB DW 0 CCC DW 0 F_MASK DW #3C00+8*"D" ; адрес знакоместа чем заливать TSCRB DS 384 ;] MASKA_A DB #FF,#7F,#3F,#1F,#0F,#07,#03,#01,#80,#C0,#E0,#F0,#F8,#FC,#FE,#FF END SAVESNA "basic-poly_text.sna",STARTFORSNA LABELSLIST "user.l"[свернуть]
Формат SJASM, но это не принципиально.
Один раз вызвать декрюнчер, потом юзать.
Для примера заливается литерой "D" со включеной инверсией. Можно регулировать.
Размер вместе с табличкой - #044F (1103 байта)
Последний раз редактировалось Destr; 08.07.2023 в 13:28.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)