Треугольник Серпинского

» опубликован
Построение треугольника Серпинского на движке Warcraft 3 методом хаоса.
» Клавиши управления
ESC - запускает/перезапускает генерацию точек.
» Генерация точек
library Fractal initializer Initialization


    globals
        private  constant  integer  DOT_ID  =  'hfoo'
    endglobals


    struct dot extends array
        private  static  constant  group allUnits  =  CreateGroup( )


        static method removeAll takes nothing returns nothing
            local  unit  enumUnit  =  null

            loop
                set  enumUnit  =  FirstOfGroup( allUnits )
                exitwhen ( enumUnit == null )
                call GroupRemoveUnit( thistype.allUnits, enumUnit )

                call RemoveUnit( enumUnit )
            endloop
        endmethod


        static method create takes real x, real y returns thistype
            call GroupAddUnit( thistype.allUnits, CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), DOT_ID, x, y, bj_UNIT_FACING ) )

            return thistype( 0 )
        endmethod

    endstruct


    globals
        private  real         lastX
        private  real         lastY

        private  real  array  attractorX 
        private  real  array  attractorY
    endglobals


    globals
        private  constant  timer    period      =  CreateTimer( )
                           integer  iterations  =  0
    endglobals


    private function iterate takes nothing returns nothing
        local  integer  i     =  GetRandomInt( 0, 2 )
        local  real     dx    =  attractorX[ i ] - lastX
        local  real     dy    =  attractorY[ i ] - lastY
        local  real     dist  =  SquareRoot( dx * dx + dy * dy )

        set  lastX  =  lastX + ( dist / 2 ) * ( dx / dist )
        set  lastY  =  lastY + ( dist / 2 ) * ( dy / dist )

        call dot.create( lastX, lastY )

        call PingMinimap( attractorX[ 0 ], attractorY[ 0 ], 0.03125 )
        call PingMinimap( attractorX[ 1 ], attractorY[ 1 ], 0.03125 )
        call PingMinimap( attractorX[ 2 ], attractorY[ 2 ], 0.03125 )

        set  iterations  =  iterations + 1
        call ClearTextMessages( )
        call BJDebugMsg( "|cFFFFCC00iterations :|r    " + I2S( iterations ) )
    endfunction


    function start takes nothing returns nothing
        set  iterations  =  0
        call dot.removeAll( )

        set  lastX            =  GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea ) )
        set  lastY            =  GetRandomReal( GetRectMinY( bj_mapInitialPlayableArea ), GetRectMaxY( bj_mapInitialPlayableArea ) )
        call dot.create( lastX, lastY )

        set  attractorX[ 0 ]  =  GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea ) )
        set  attractorY[ 0 ]  =  GetRandomReal( GetRectMinY( bj_mapInitialPlayableArea ), GetRectMaxY( bj_mapInitialPlayableArea ) )
        call dot.create( attractorX[ 0 ], attractorY[ 0 ] )

        set  attractorX[ 1 ]  =  GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea ) )
        set  attractorY[ 1 ]  =  GetRandomReal( GetRectMinY( bj_mapInitialPlayableArea ), GetRectMaxY( bj_mapInitialPlayableArea ) )
        call dot.create( attractorX[ 1 ], attractorY[ 1 ] )

        set  attractorX[ 2 ]  =  GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea ) )
        set  attractorY[ 2 ]  =  GetRandomReal( GetRectMinY( bj_mapInitialPlayableArea ), GetRectMaxY( bj_mapInitialPlayableArea ) )
        call dot.create( attractorX[ 2 ], attractorY[ 2 ] )


        call TimerStart( period, 0.03125, true, function iterate )
    endfunction


    private function Initialization takes nothing returns nothing
        call EnableSelect( true, false )
        call EnablePreSelect( false, false )
        call FogEnable( false )
        call FogMaskEnable( false )
    endfunction


endlibrary


Просмотров: 493

» Лучшие комментарии


BrEd Pitt #1 - 1 год назад 2
Обалденно! У меня когда-то была курсовая по стохастическим фракталам и их применению в айти. Помню, как написал простенькую прогу для визуализации (но это не в главе про игру хаоса), где взял сидами по две цифры числа пи (пришлось подумать над знаками, правда) и получил фрактальный анемон в некотором роде.
Может, забабахаешь винеровский процесс?
ScopteRectuS #2 - 1 год назад 0
BrEd Pitt, типа такого что ли? Я пока что планировал сделать квадрат Серпинского.
Вернее не квадрат, а чтобы можно можно было устанавливать кол-во вершин.
BrEd Pitt #3 - 1 год назад 2
не, гораааздо больше точек. Как кофейная гуща, найду скрин - кину. Точно помню, что делал
Msey #5 - 1 год назад (отредактировано ) 17
GeneralElConsul #6 - 1 год назад 0
Не понятны приколы. Такие алгоритмы на каком инструменте знаешь, на таком и сделал, трамвай из буханки вообще не в тему.
Fakov #7 - 1 год назад 0
GeneralElConsul:
Не понятны приколы. Такие алгоритмы на каком инструменте знаешь, на таком и сделал, трамвай из буханки вообще не в тему.
а зачем?