Jump to content

Reptillian

Members
  • Posts

    1,238
  • Joined

  • Last visited

  • Days Won

    18

Posts posted by Reptillian

  1. I do have a earlier code that works, however, it involves separate propRules. It works, however at the start, some controls are enabled until I change options and that is when behavior is correct. Changing the defaults is the easiest solution.

     

    I wanted the control if (the checkbox is not checked) AND (any one of the three list selections is made).

     

    As I'm new to indirectui as I barely use it except in rare cases, I would like a example of what you mean.

  2.   

    Let's say I have a plugin option. The plugin option should only activates if a boolean option is checked off, and any of three dropdown option.

     

    Here's what I have:

     

                propRules.Add(new ReadOnlyBoundToNameValuesRule(PropertyNames.Points,true,
                    (PropertyNames.Use_clipboard_as_tile, false),
                    (PropertyNames.Pretile_mode, Pretile_modeOptions.Pretile_modeOption18),
                    (PropertyNames.Pretile_mode, Pretile_modeOptions.Pretile_modeOption21),
                    (PropertyNames.Pretile_mode, Pretile_modeOptions.Pretile_modeOption22)
                    ));

     

    I want PropertyNames.Point to be only activated if clipboard option is set to false, and when the dropdown option is set to any of these option. Otherwise, it is grayed out.

     

    I don't know how to explain this better, but hopefully, this gets the idea.

     

    Also, from the other thread, this always is true:

     

                propRules.Add(new ReadOnlyBoundToNameValuesRule(PropertyNames.Thickness, true, new TupleStruct<object, object>[] {
                    new TupleStruct<object, object>(PropertyNames.Use_clipboard_as_tile, false),
                    new TupleStruct<object, object>(PropertyNames.Pretile_mode,Pretile_modeOptions.Pretile_modeOption22)
                }));

     

  3. 41 minutes ago, BDP said:

    I'm using the latest PDN, and forced an update to the G'Mic filters, and I don't see the above filter. Even did a search. Am I missing something?

     

    Brian

     

     

    If it doesn't appear, then that means the current version of G'MIC is no longer supported. G'MIC 3 is on the horizon, but these are supported by Krita and GIMP. You'll have to wait.

  4. 11 hours ago, Rick Brewster said:

    2) it must be installed to its own folder within Effects/FileTypes

    Requesting a quick clarification as I'm not sure what's the requirement is in my case.

     

    I have GMICSharpNative folder inside the effects folder or document/app files folder. So, every dlls that utilize GMICSharp library must be inside the folder? That's what you mean?

     

    As for the deps thing, going into .NET 5 with this setup is beyond me, so I can't do anything about that unfortunately though I will have assistance from @null54as he worked on this.

  5. Randomly divides the canvas into smaller rectangles, where the initial rectangle is the canvas itself.

     

    Preview:

     

    unknown.png

    On the parameters that needs note:

    Number of colors - defines the number of color on canvas. If it is 0, then with infinite memory, then infinity number of colors is possible. Otherwise, the number of colors is equal to 2 or higher, and if it is less than 2, then 2 colors.

    Loop Limit - Define the maximum loop possible. Sometimes, the generation of rectangle will complete before the loop, so that's why sometimes you don't see changes.

    Border(%) - This define the thickness of border. Sometimes border won't show up because of issues regarding to discrete space of raster graphic. I don't know how to explain this.

     

    Installation:

    Plugin Files -> Random Rectangle Division.zip

    1. Insert the .dll into effect folder of paint.net installation

    2. Find it under Texture.

     

    Bugs:

    1. Border Color will be active if there is no border. I cannot fix this bug as it requires me to figure out how to make it visible using mathematical operation within variables.

     

    Source code:

    CodeLab

    Spoiler
    // Name: Random Rectangle Division
    // Submenu: Texture
    // Author: Reptorian.
    // Title: Random Rectangle Division
    // Version: 1
    // Desc: Create randomly divided rectangle on Canvas
    // Keywords: Rectangles
    // URL: https://forums.getpaint.net/profile/85868-reptillian/
    // Help:
    #region UICode
    IntSliderControl max_divide = 10; // [1,20] Division
    IntSliderControl init_add_thick = 1; // [0,100] Additional Thickness
    IntSliderControl max_iter = 5; // [2,40] Maximum Division Iteration
    IntSliderControl probability = 95; // [0,100] Probability of Division(%)
    IntSliderControl max_loop = 2000; // [2000,2097152] Loop Limit
    DoubleSliderControl init_border = 100; // [0,100] Border(%)
    ReseedButtonControl seed = 0; // Reseed
    ColorWheelControl border_color = ColorBgra.FromBgr(0, 0, 0); // [Black] Border Color
    ListBoxControl color_choice = 1; // Color Mode|Random RGB|Grayscale
    IntSliderControl num_rgb = 0; // [0,100] {color_choice} Number of Random RGB Colors
    ReseedButtonControl seed2 = 0; // {color_choice} Reseed Color
    #endregion
    
    int [,] Rectangles_Surface;
    ColorBgra[] Random_RGB;
    
    Random Seed = new Random();
    Random Seed_2 = new Random();
    int new_seed,new_seed_2;
    
    List<(int,int,int,int,int)> Modifiable_Rect = new List<(int,int,int,int,int)>{
                (0,0,0,0,0)
    };
    
    List<(int,int,int,int,int)> Unmodifiable_Rect = new List<(int,int,int,int,int)>{
                (0,0,0,0,0)
    };
    
    
    bool diff_check(int a)
    {
        int mri = max_divide;
        double ds = (double)(a/mri);
        if (mri>1&&(ds<1)){
            while(mri>1&&(ds<1)){
                mri--;
                ds = (double)(a/mri);
            }
        }
    
        return ds>1;
    }
    
    
    bool pass=false;
    
    Random myRandom,myRandom2;
    
    void split_column(int point,int test_boundary,int border_size){
            bool skip = false;
            int mx=0;
            int np;
    
            int ri = myRandom.Next(1,max_divide)+1;
            int mri = ri - 1;
    
            int min_x=Modifiable_Rect[point].Item1;
            int max_x=Modifiable_Rect[point].Item2;
            int min_y=Modifiable_Rect[point].Item3;
            int max_y=Modifiable_Rect[point].Item4;
            int itern=Modifiable_Rect[point].Item5+1;
    
            Modifiable_Rect.RemoveAt(point);
    
            int sx = min_x+test_boundary;
            int ex = max_x-test_boundary;
    
            int diff=ex-sx;
            bool bound_check = diff>test_boundary;
            bool rb;
    
            int min_v,max_v;
    
            if (bound_check)
            {
                double ds=(double)(diff/mri);
                if(mri>1&&(ds<=test_boundary))
                {
                    while(mri>1&&(ds<=test_boundary))
                    {
                        ri--;
                        mri--;
                        ds=(double)(diff/mri);
                    }
                }
                if(test_boundary>0||diff>0?(ds>(double)(test_boundary)):true)
                {
                    int p=min_x;
                    for(int ri_ind=0; ri_ind<ri ; ri_ind++)
                    {
                        rb=myRandom.Next(0,99)>(probability-1);
                        if (ri_ind==mri)
                        {
                            if (p>max_x)
                            {
                                p=max_x;
                                if((max_y-min_y)==0){rb=true;}
                            }
                            if (rb || (itern==max_iter))
                            {
                                Unmodifiable_Rect.Add((p,max_x,min_y,max_y,itern));
                            }
                            else
                            {
                                Modifiable_Rect.Add((p,max_x,min_y,max_y,itern));
                            }
    
                        }
                        else
                        {
                            if(ri_ind==0)
                            {
                                mx=(int)(Math.Round((double)(sx+ds)));
                                min_v=Math.Min(p,mx);
                                max_v=Math.Max(p,mx);
                                np=Math.Min(Math.Max(sx,myRandom.Next(min_v,max_v)),ex);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((p,np,min_y,max_y,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((p,np,min_y,max_y,itern));
                                }
                                p=np+1;
                                if(p>=ex){skip=true;}
                            }
                            else
                            {
                                if(skip){continue;}
                                mx=(int)(Math.Round((double)(mx+ds)));
                                min_v=Math.Min(p,mx);
                                max_v=Math.Max(p,mx);
                                np=Math.Min(Math.Max(p+border_size,myRandom.Next(min_v,max_v)),ex);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((Math.Min(p,ex),np,min_y,max_y,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((Math.Min(p,ex),np,min_y,max_y,itern));
                                }
                                p=np+1;
                            }
                        }
                    }
                }
                else
                {
                    Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
                }
            }
            else
            {
                Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
            }
    }
    
    void split_row(int point,int test_boundary,int border_size){
            bool skip = false;
            int my=0;
            int np;
    
            int ri = myRandom.Next(1,max_divide)+1;
            int mri = ri - 1;
    
            int min_x=Modifiable_Rect[point].Item1;
            int max_x=Modifiable_Rect[point].Item2;
            int min_y=Modifiable_Rect[point].Item3;
            int max_y=Modifiable_Rect[point].Item4;
            int itern=Modifiable_Rect[point].Item5+1;
    
            Modifiable_Rect.RemoveAt(point);
    
            int sy = min_y+test_boundary;
            int ey = max_y-test_boundary;
            int diff=ey-sy;
            bool bound_check = diff>test_boundary;
            bool rb;
    
            int min_v,max_v;
    
            if (bound_check)
            {
                
                double ds=(double)(diff/mri);
                if(mri>1&&(ds<=test_boundary))
                {
                    while(mri>1&&(ds<=test_boundary))
                    {
                        ri--;
                        mri--;
                        ds=(double)(diff/mri);
                    }
                }
                if(test_boundary>0||diff>0?(ds>(double)(test_boundary)):true)
                {
                    int p=min_y;
                    for(int ri_ind=0; ri_ind<ri ; ri_ind++)
                    {
                        rb=myRandom.Next(0,99)>(probability-1);
                        if (ri_ind==mri)
                        {
                            if (p>max_y)
                            {
                                p=max_y;
                                if((max_x-min_x)==0){rb=true;}
                            }
                            if (rb || (itern==max_iter))
                            {
                                Unmodifiable_Rect.Add((min_x,max_x,p,max_y,itern));
                            }
                            else
                            {
                                Modifiable_Rect.Add((min_x,max_x,p,max_y,itern));
                            }
    
                        }
                        else
                        {
                            if(ri_ind==0)
                            {
                                my=(int)(Math.Round((double)(sy+ds)));
                                min_v=Math.Min(p,my);
                                max_v=Math.Max(p,my);
                                np=Math.Min(Math.Max(sy,myRandom.Next(min_v,max_v)),ey);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((min_x,max_x,p,np,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((min_x,max_x,p,np,itern));
                                }
                                p=np+1;
                                if(p>=ey){skip=true;}
                            }
                            else
                            {
                                if(skip){continue;}
                                my=(int)(Math.Round((double)(my+ds)));
                                min_v=Math.Min(p,my);
                                max_v=Math.Max(p,my);
                                np=Math.Min(Math.Max(p+border_size,myRandom.Next(min_v,max_v)),ey);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((min_x,max_x,Math.Min(p,ey),np,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((min_x,max_x,Math.Min(p,ey),np,itern));
                                }
                                p=np+1;
                            }
                        }
                    }
                }
                else
                {
                    Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
                }
            }
            else
            {
                Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
            }
    }
    
    bool finished_init;
    
    int trs,trs_2,length;
    
    void PreRender(Surface dst, Surface src)
    {
    
        int rs=Seed.Next();
        int rs_2=Seed_2.Next();
        if (!finished_init)
        {
            trs=rs;
            trs_2=rs_2;
        }
    
        if (Rectangles_Surface==null)
        {
            Modifiable_Rect.RemoveRange(0,1);
            Unmodifiable_Rect.RemoveRange(0,1);
            Rectangles_Surface=new int [src.Width,src.Height];
        }
        else
        {
            Modifiable_Rect.RemoveRange(0,Modifiable_Rect.Count);
            Unmodifiable_Rect.RemoveRange(0,Unmodifiable_Rect.Count);
            Array.Clear(Rectangles_Surface,0,src.Width*src.Height);
        }
    
        if (new_seed != seed)
        {
            Modifiable_Rect.RemoveRange(0,Modifiable_Rect.Count);
            Unmodifiable_Rect.RemoveRange(0,Unmodifiable_Rect.Count);
            trs=rs;
        }
        else
        {
            if (!finished_init){
                trs=rs;
            }
        }
    
        if (new_seed_2 != seed2)
        {
            trs_2=rs_2;
        }
        else
        {
            if (!finished_init){
                trs_2=rs_2;     
            }
        }
    
    
        myRandom = new Random(trs);
        myRandom2 = new Random(trs_2);
    
        new_seed = seed;
        new_seed_2 = seed2;
    
        int width  = src.Width  - 1;
        int height = src.Height - 1;
        int border_size;
        int test_boundary;
    
        if (init_add_thick>0)
        {
            border_size=init_add_thick+1;
            test_boundary=border_size+1;
        }
        else{
            border_size=0;
            test_boundary=0;
        }
    
        int border = (int)(Math.Round((double)(init_add_thick*init_border/100)));
    
        bool contain_border = border>0;
        bool width_check=diff_check(width-border_size*2);
        bool height_check=diff_check(height-border_size*2);
    
        if (width_check||height_check){
            pass = true;
            Modifiable_Rect.Add((0,width,0,height,0));
    
            if (width_check&&height_check)
            {
                if (myRandom.Next(0,2)==0)
                {
                    split_column(0,test_boundary,border_size);
                }
                else
                {
                    split_row(0,test_boundary,border_size);
                }
            }
            else
            {
                if (height_check)
                {
                    split_column(0,test_boundary,border_size);
                }
                else
                {
                    split_row(0,test_boundary,border_size);
                }
            }
    
            int arr_point=0;
            int p_ind;
    
            while(Modifiable_Rect.Count>0)
            {
                p_ind=myRandom.Next(Modifiable_Rect.Count);
                if(myRandom.Next(0,2)==0)
                {
                    split_column(p_ind,test_boundary,border_size);
                }
                else
                {
                    split_row(p_ind,test_boundary,border_size);
                }
                arr_point++;
                if(arr_point>=max_loop){break;}
            }
    
    
            int new_min_x;
            int new_max_x;
            int new_min_y;
            int new_max_y;
            int nv=0;
    
            int ex,ey,bx,by;
    
            int bex=src.Width-1-border;
            int bey=src.Height-1-border;
    
            if (Modifiable_Rect.Count>0)
            {
                for (int i = 0 ; i < Modifiable_Rect.Count ; i++){
                    new_min_x=Modifiable_Rect[i].Item1;
                    new_max_x=Modifiable_Rect[i].Item2;
                    new_min_y=Modifiable_Rect[i].Item3;
                    new_max_y=Modifiable_Rect[i].Item4;
                    ex = new_max_x+1;
                    ey = new_max_y+1;
                    bx = new_min_x + border;
                    by = new_min_y + border;
                    for (int x = new_min_x ; x<ex ; x++)
                    {
                        for (int y = new_min_y ; y<ey ; y++)
                        {
                            if (x < bx || y < by || x > bex || y > bey)
                            {
                                Rectangles_Surface[x,y]=-1;
                            }
                            else
                            {
                                Rectangles_Surface[x,y]=nv;
                            }
                            
                        }
                    }
                    nv++;
                }
            }
    
    
            if (Unmodifiable_Rect.Count>0)
            {
                for (int j = 0 ; j < Unmodifiable_Rect.Count ; j++)
                {
                    new_min_x=Unmodifiable_Rect[j].Item1;
                    new_max_x=Unmodifiable_Rect[j].Item2;
                    new_min_y=Unmodifiable_Rect[j].Item3;
                    new_max_y=Unmodifiable_Rect[j].Item4;
                    ex=new_max_x+1;
                    ey=new_max_y+1;
                    bx = new_min_x + border;
                    by = new_min_y + border;
                    for (int x = new_min_x ; x<ex ; x++)
                    {
                        for (int y = new_min_y ; y<ey ; y++)
                        {
                            if (x < bx || y < by || x > bex || y > bey)
                            {
                                Rectangles_Surface[x,y]=-1;
                            }
                            else
                            {
                                Rectangles_Surface[x,y]=nv;
                            }
                            
                        }
                    }
                    nv++;
                }
            }
            length = nv+1;
            if (color_choice==0){
                byte tb,tg,tr;
                Random_RGB = new ColorBgra[length];
                for (int n = 0 ; n < length ; n++)
                {
                    tb=(byte)(myRandom2.Next(256));
                    tg=(byte)(myRandom2.Next(256));
                    tr=(byte)(myRandom2.Next(256));
                    Random_RGB[n]=ColorBgra.FromBgr(tb,tg,tr);
                }
            }
        }
    
        finished_init = true;
    }
    
    void Render(Surface dst, Surface src, Rectangle rect)
    {
        // Delete any of these lines you don't need
    
        byte v;
        double rescale=(double)(length)/255;
    
        int total_colors=Math.Max(num_rgb,2);
        if (pass)
        {
            for (int y = rect.Top; y < rect.Bottom; y++)
            {
                if (IsCancelRequested) return;
                for (int x = rect.Left; x < rect.Right; x++)
                {
                    if (Rectangles_Surface[x,y]==-1)
                    {
                        dst[x,y]=border_color;
                    }
                    else
                    {
                        if (color_choice==0)
                        {
                            if (num_rgb>0)
                            {
                                dst[x,y]=Random_RGB[Rectangles_Surface[x,y]%total_colors];
                            }
                            else
                            {
                                dst[x,y]=Random_RGB[Rectangles_Surface[x,y]];
                            }                       
                        }
                        else
                        {
                            v=(byte)((int)(Math.Round((double)(Rectangles_Surface[x,y])/rescale)));
                            dst[x,y]=ColorBgra.FromBgr(v,v,v);
                        }
                    }
                }
            }
        }
    }

     

    G'MIC

    Spoiler
    rep_random_rectangular_division:
    skip ${2=0},${3=5},${4=95%},${5=5000},${6=}
    check "$4>0"
    repeat $! l[$>]
     _rep_random_rectangular_division $*
    endl done
    _rep_random_rectangular_division:
    skip ${2=0},${3=5},${4=95%},${5=5000},${6=}
    
    r 100%,100%,1,1
    
    1,1,1,5 #Modifiable Rectangle Array
    1,1,1,5 #Unmodifiable Rectangle Array
    
    eval ${-math_lib}"
     if(narg($6),srand($6););
     const ww=w#-3-1;
     const hh=h#-3-1;
     const max_split=max(1,int(abs($1)));
     const internal_space=int(abs($2));
     const test_boundary=internal_space?(internal_space+1);
     const max_iter=max(2,round(abs($3)));
     const odd=cut($4,0,1);
     const arr_limit=round(abs($5));
    
     diff_check(a)=(
      mri=max_split;
      ds=a/mri;
      if(mri>1&&ds<1,
       while(mri>1&&ds<1,
        mri--;
        ds=a/mri;
       );
      );
      ds>1;
     );
    
     width_check=diff_check(ww-internal_space*2);
     height_check=diff_check(hh-internal_space*2);
    
     !(width_check||height_check)?run('error inv_dim');
    
     dar_insert(#-2,[0,ww,0,hh,0]);
    
     sub_column(v,point)=(
      ri=int(u(1,max_split))+1;
      mri=ri-1;
      sx=v[0]+test_boundary;
      ex=v[1]-test_boundary;
      diff=ex-sx;
      bound_check=diff>test_boundary;
      skip=0;
      dar_remove(#-2,point);
      if(bound_check,
       ds=diff/mri;
       if(mri>1&&ds<=test_boundary,
        while(mri>1&&ds<=test_boundary,
         ri--;
         mri--;
         ds=diff/mri;
        );
       );
       if(test_boundary||diff?(ds>test_boundary):1,
        py=[v[2],v[3]];
        iter=v[4]+1;
        p=v[0];
        repeat(ri,ri_ind,
         rb=odd<1?u(0,1)>odd:0;
         ri_ind==mri?(
          if(p>v[1],
           p=v[1];
           if(!(v[3]-v[2]),rb=1;);
          );
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[p,v[1],py,iter]);
          ):(
           dar_insert(#-2,[p,v[1],py,iter]);
          );
         ):
         !ri_ind?(
          mx=sx+ds;
          np=min(max(sx,round(u(p,mx))),ex);
          vp=[p,np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[vp,py,iter]);
          ):(
           dar_insert(#-2,[vp,py,iter]);
          );
          p=np+1;
          if(p>=ex,skip=1;);
         ):(
          if(skip,continue(););
          mx+=ds;
          np=min(max(p+internal_space,round(u(p,mx))),ex);
          vp=[min(p,ex),np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[vp,py,iter]);
          ):(
           dar_insert(#-2,[vp,py,iter]);
          );
          p=np+1;
         );
        );
       ,dar_insert(#-1,v);
       );
      ,dar_insert(#-1,v);
      );
     );
    
     sub_row(v,point)=(
      ri=int(u(1,max_split))+1;
      mri=ri-1;
      sy=v[2]+test_boundary;
      ey=v[3]-test_boundary;
      diff=ey-sy;
      bound_check=diff>test_boundary;
      skip=0;
      dar_remove(#-2,point);
      if(bound_check,
       ds=diff/mri;
       if(mri>1&&ds<=test_boundary,
        while(mri>1&&ds<=test_boundary,
         ri--;
         mri--;
         ds=diff/mri;
        );
       );
       if(test_boundary||diff?(ds>test_boundary):1,
        px=[v[0],v[1]];
        iter=v[4]+1;
        p=v[2];
        repeat(ri,ri_ind,
         rb=odd<1?u(0,1)>odd:0;
         ri_ind==mri?(
          if(p>v[3],
           p=v[3];
           if(!(v[1]-v[0]),rb=1;);
          );
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[px,p,v[3],iter]);
          ):(
           dar_insert(#-2,[px,p,v[3],iter]);
          );
         ):
         !ri_ind?(
          my=sy+ds;
          np=min(max(sy,round(u(p,my))),ey);
          vp=[p,np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[px,vp,iter]);
          ):(
           dar_insert(#-2,[px,vp,iter]);
          );
          p=np+1;
          if(p>=ey,skip=1;);
         ):(
          if(skip,continue(););
          my+=ds;
          np=min(max(p+internal_space,round(u(p,my))),ey);
          vp=[min(p,ey),np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[px,vp,iter]);
          ):(
           dar_insert(#-2,[px,vp,iter]);
          );
          p=np+1;
         );
        );
       ,dar_insert(#-1,v);
       );
      ,dar_insert(#-1,v);
      );
     );
    
    
     v=I[#-2,0];
    
     width_check&&height_check?(
      u(0,1)<=.5?(
       sub_row(v,0);
      ):(
       sub_column(v,0);
      );
     ):
     width_check?(
      sub_column(v,0);
     ):
     height_check?(
      sub_row(v,0);
     );
    
     arr_point=0;
    
     while(dar_size(#-2),
      p_ind=int(u(dar_size(#-2)));
      cv=I[#-2,p_ind];
      u(0,1)<.5?(
       sub_row(cv,p_ind);
      ):(
       sub_column(cv,p_ind);
      );
      arr_point++;
      if(arr_point>=arr_limit,break());
     );
    
     resize(#-2,1,dar_size(#-2),1,4,0);
     resize(#-1,1,dar_size(#-1),1,4,0);"
    
    a[-2,-1] y
    
    eval. :"begin(
      convert2coords(c)=(
       tl=[c[0],c[2]];
       tr=[c[1],c[2]];
       bl=[c[0],c[3]];
       br=[c[1],c[3]];
       [tl,tr,br,bl];
      );
     );
     polygon(#-2,4,convert2coords(I),1,y);"
    
    rm.
    #@gui Random Rectangle Division: fx_rep_rrd,fx_rep_rrd
    #@gui :_=separator(),_=note("<b>Main</b>")
    #@gui :Division=int(10,1,20)
    #@gui :Additional Thickness=int(5,0,100)
    #@gui :Maximum Division Iteration=int(5,2,40)
    #@gui :Probability of Division(%)=float(95,20,100)
    #@gui :Loop Limit=int(50000,1000,2097152)
    #@gui :Seed=int(0,0,300)
    #@gui :Border(%)=float(35,0,100)
    #@gui :_=separator(),_=note("<b>Color</b>")
    #@gui :Mode=choice(0,"Grayscale","Palette","Random")
    #@gui :Normalize?=bool(1)
    #@gui :Palette=choice(12,"BW-{2}","RGB-{3}","B-RGB-{4}","BW-RGB-{5}","CMY-{3}","CMYK-{4}","W-CMYK-{5}","RGBCMY-{6}","1-Bit-RGB-{8}","Aurora-{256}","PLAYPAL-{249}","Sonic Robo Blast 2-{256}","Famicube-{64}","Andrew Kensler - 16","Andrew Kensler - 32","Andrew Kensler - 54","AAP-Micro 12","AAP-16","AAP-64","AAP-SPLENDOR128","DB8","DB16","DB32","DB-ISO22","DimWiddy 17","DimWiddy 23","Endesga-4","Endesga-8","Endesga-16","Endesga-32","Endesga-36","Endesga-64","Juicy-32","Juicy-56","XAIUE-22","15P-DX","20P-DX","24P-DX","Cabana-64","Fantasy 16","Fantasy 24","Tranquil Fantasy 23","Tranquility Plus 39","Faraway 48","Fleja Master Palette-{33}","Koni32","Linear Color Palette Basic-{31}","Vines Flexible Linear Ramps-{38}","Arcade Standard 29","ARQ16","BLK 36","BLK-NEO-{46}","Broken Facility-{40}","Bubblegum-16","Cade 15","Calder 8-{11}","Chromatic16","CD-BAC-{16}","CG Arne-{16}","CPC BOY-{32}","Dinoknight 16","||||-22","FZT Ethereal 16","GZXP-{11}","Indecision-{17}","Island Joy 16","Journey-{64}","Juicy 17","Oak21","Nature's Embrace 55","Nauris-16","Pear 36","Peachy Pop 16-{16}","Pineapple 32","Resurrect 32-{32}","Rosy 42","SLSO-CLR17","Softy 15","SPEC12","Starmancer-{52}","Superb 8","SuperFuture25","Sweetie 16","Taffy 16","Todayland Palette V2-{25}","Vivid-17","Voodo34","Zughy 32","ENOS16","Undertones-17","Equpix 15","Night 16","Star 29","Star 34","Still-Life-{14}","SimpleJPC-16","Acid 15","Battery 24","Clumpy 18","Cthulhu-{16}","Crimso 11","Copper-Tech-{16}","DRZ15A","Eggy 15","Eroge-Copper","Europa 16-{16}","GreyT-bit-{8}","Jewel-{15}","Polar 11","Sheltzy 32","Rube-Goldberg-{9}","BoomBoom-{7}","Generic-8","Matriax8c","NT1H-{26}","Autum 15","Autum 15 [Yellow]","JerryPie 22","Naji 16","Blessing-{5}","Crayola Blind-{9}","Easter Island-{16}","Fairy Tales-{8}","Fuzzy Four-{4}","0xdb-01-{17}","Ocaso-{17}","Pastel-{15}","17 Pastels","Pollen-8","Nopal-12","Sy17","Syz15","TUI-15","Cave-{8}","Psygnosia-{16}","MarshMellow32","Rabbit 7","Finlal 11","Vinik 24","YKB-22","Graveyard-21","Steam Lords-{16}","AAP-RadiantXV-{15}","AAP-Majesty XVII-{17}","Daruda 22","Rust-6","XAIUE-Radiant-{22}","Firestorm-{9}","SuperNova 7","NYX8","OIL6","SGM-Palette 2-{17}","Fornax Void I-{256}","Fornax Void II-{128}","Pixelwave-{12}","Spacey Easter-{17}","Moonlit-39","Petite-8","Petite-8 Afterdark","Autochrome 3","Autochrome 5","GB Default #1-{4}","GB Default #2-{4}","GB Andrade-{4}","GB Blue Seni-{4}","GB Blackzone-{4}","GB Crimson-{4}","GB Didi-{4}","GB Dirty-{4}","GB Arne-{4}","GB Easy-{4}","GB Forest-{4}","GB Harsh Green-{4}","GB Light Green-{4}","GB Nostalgia-{4}","GB Platinum-{4}","GB Kirokaze-{4}","GB PJ-{4}","GB Cyber-{4}","GB Wish-{4}","GB Grapefruit-{4}","GB Ice Cream-{4}","GB Red_Blue-{4}","GB Spacehaze-{4}","GB Chocolate-{4}","GB Purple Dawn-{4}","GB Gray-{4}","ARNE4","HallowPumpkin-{4}","Amiga 2600 NTSC-{128}","Amiga 2600 PAL-{104}","Amiga 2600 SECAM-{8}","Amiga 7800 M.E.S.S-{256}","Amiga 7800-{256}","Amstrad CPC-{27}","Apple II-{15}","CGA-{16}","CGA Mode 0 [Low]-{4}","CGA Mode 0 [High]-{4}","CGA Mode 1 [Low]-{4}","CGA Mode 1 [High]-{4}","CGA Mode 2 [Low]-{4}","CGA Mode 2 [High]-{4}","Commodore 64 [Pepto Interpretation]-{16}","Commodore 64 [Colodore Interpretation]-{16}","Commodore VIC-20-{16}","Colecovision-{15}","Japanese Machine Palette-{16}","Macintosh II-{16}","NES-{52}","PICO-8-{16}","RISC OS-{16}","SAM Coupe-{128}","Thomson MO5-{16}","VGA-{244}","ZX Spectrum-{15}","GNOME 32-{32}","Electronic Crayon 22","Chip16","MSX-{15}","Deluxe Paint-{222}","Legacy Paint-{16}","XP Paint-{28}","Vista Paint-{28}")
    #@gui :Color Space=choice(0,"RGB","HSI")
    #@gui :Number of Color=int(0,0,100)
    #@gui :Seed=int(0,0,100000)
    #@gui :Border=color(0,0,0)
    #@gui :_=separator(),_=note("<small>Author: Reptorian. Latest Update: <i>2021/09/26</i>.</small>")
    fx_rep_rrd:
    border_size={max(0,round($2*$7/100))}
    repeat $! l[$>]
     rep_random_rectangular_division ${1-3},$4%,${5-6}
    
     if $8==0
      if $9 n. 0,255 fi
      to_rgb.
     elif $8==1 pal $10 {w},1,1,1,begin(srand($13));u pixelsort.. +,x,[-1] rm.
     else
      if $11 {$12?$12:iM+1},1,1,3,begin(srand($13));[u(360),u(1),u(1)]
      else {$12?$12:iM+1},1,1,3,begin(srand($13));[u(255),u(255),u(255)]
      fi
     fi
    
     if $border_size +rep_create_border_for_rrd[0] $border_size fi
    
     if $8
      map[0] [1],2 rm[1]
      if $11&&$8==2 hsi2rgb[0] fi
     fi
    
     if $border_size
      eval. i?I(#0)=[${14-16}];
     fi
    
     k[0]
    endl done
    u "{$1}"\
    "{$2}"\
    "{$3}"\
    "{$4}"\
    "{$5}"\
    "{$6}"\
    "{$7}"\
    "{$8}"\
    "{$9}"_{!$8?2}\
    "{$10}"_{$8==1?2}\
    "{$11}"_{$8==2?2}\
    "{$12}"_{$8==2?2}\
    "{$13}"_{$8?2}\
    "{$14,$15,$16}"_{$border_size?2:1}
    +rep_create_border_for_rrd:
    +f (i!=j(-1,0))||(i!=j(0,-1))
    dilate. $1
    f. i||x<$1||y<$1||x>(w-$1-1)||y>(h-$1-1)

     

     

    • Like 1
    • Upvote 2
  6. I think I'm just gonna leave it with this uncomplete code. Turns out it's not achievable:

     

    Here's what I get (hence why I don't think it can be achieved):

     

    unknown.png?width=1073&height=621

    The expected output:

     

    unknown.png?width=621&height=621

    With more work, it can look like this: https://cdn.discordapp.com/attachments/880256029705773099/893671307558916157/unknown.png

    // Name:
    // Submenu:
    // Author:
    // Title:
    // Version:
    // Desc:
    // Keywords:
    // URL:
    // Help:
    #region UICode
    IntSliderControl max_divide = 10; // [1,20] Division
    IntSliderControl init_add_thick = 1; // [0,100] Additional Thickness
    IntSliderControl max_iter = 5; // [2,40] Maximum Division Iteration
    IntSliderControl probability = 95; // [0,100] Probability of Division(%)
    IntSliderControl max_loop = 2000; // [2000,2097152] Loop Limit
    DoubleSliderControl border = 10; // [0,100] Border(%)
    ReseedButtonControl seed = 0; // Reseed
    #endregion
    #if DEBUG
    #endif
    
    ColorBgra[,] Rectangles_Surface;
    ColorBgra Empty_Color=ColorBgra.Black;
    
    Random Seed = new Random();
    int new_seed;
    
    List<(int,int,int,int,int)> Modifiable_Rect = new List<(int,int,int,int,int)>{
                (0,0,0,0,0)
    };
    
    List<(int,int,int,int,int)> Unmodifiable_Rect = new List<(int,int,int,int,int)>{
                (0,0,0,0,0)
    };
    
    
    bool diff_check(int a)
    {
        int mri = max_divide;
        double ds = (double)(a/mri);
        if (mri>1&&(ds<1)){
            while(mri>1&&(ds<1)){
                mri--;
                ds = (double)(a/mri);
            }
        }
    
        return ds>1;
    }
    
    
    bool pass=false;
    
    Random myRandom;
    
    void split_column(int point,int test_boundary,int border_size){
            bool skip = false;
            int mx=0;
            int np;
    
            int ri = myRandom.Next(1,max_divide)+1;
            int mri = ri - 1;
    
            int min_x=Modifiable_Rect[point].Item1;
            int max_x=Modifiable_Rect[point].Item2;
            int min_y=Modifiable_Rect[point].Item3;
            int max_y=Modifiable_Rect[point].Item4;
            int itern=Modifiable_Rect[point].Item5+1;
    
            Modifiable_Rect.RemoveAt(point);
    
            int sx = min_x+test_boundary;
            int ex = max_x-test_boundary;
    
            bool bound_check = (ex-sx)>test_boundary;
            bool rb;
    
            int min_v,max_v;
    
            if (bound_check)
            {
                int diff=ex-sx;
                double ds=(double)(diff/mri);
                if(mri>1&&(ds<=test_boundary))
                {
                    while(mri>1&&(ds<=test_boundary))
                    {
                        ri--;
                        mri--;
                        ds=(double)(diff/mri);
                    }
                }
                if(((test_boundary>0)||(diff>0))?(ds>(double)(test_boundary)):true)
                {
                    int p=min_x;
                    for(int ri_ind=0; ri_ind<ri ; ri_ind++)
                    {
                        rb=myRandom.Next(0,99)>(probability-1);
                        if (ri_ind==mri)
                        {
                            if (p>max_x)
                            {
                                p=max_x;
                                if((max_y-min_y)==0){rb=true;}
                            }
                            if (rb || (itern==max_iter))
                            {
                                Unmodifiable_Rect.Add((p,max_x,min_y,max_y,itern));
                            }
                            else
                            {
                                Modifiable_Rect.Add((p,max_x,min_y,max_y,itern));
                            }
    
                        }
                        else
                        {
                            if(ri_ind==0)
                            {
                                mx=(int)(Math.Round((double)(sx+ds)));
                                min_v=Math.Min(p,mx);
                                max_v=Math.Max(p,mx);
                                np=Math.Min(Math.Max(sx,myRandom.Next(min_v,max_v)),ex);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((p,np,min_y,max_y,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((p,np,min_y,max_y,itern));
                                }
                                p=np+1;
                                if(p>=ex){skip=true;}
                            }
                            else
                            {
                                if(skip){continue;}
                                mx=(int)(Math.Round((double)(mx+ds)));
                                min_v=Math.Min(p,mx+1);
                                max_v=Math.Max(p,mx+1);
                                np=Math.Min(Math.Max(p+border_size,myRandom.Next(min_v,max_v)),ex);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((Math.Min(p,ex),np,min_y,max_y,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((Math.Min(p,ex),np,min_y,max_y,itern));
                                }
                                p=np+1;
                            }
                        }
                    }
                }
                else
                {
                    Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
                }
            }
            else
            {
                Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
            }
    }
    
    void split_row(int point,int test_boundary,int border_size){
            bool skip = false;
            int my=0;
            int np;
    
            int ri = myRandom.Next(1,max_divide)+1;
            int mri = ri - 1;
    
            int min_x=Modifiable_Rect[point].Item1;
            int max_x=Modifiable_Rect[point].Item2;
            int min_y=Modifiable_Rect[point].Item3;
            int max_y=Modifiable_Rect[point].Item4;
            int itern=Modifiable_Rect[point].Item5+1;
    
            Modifiable_Rect.RemoveAt(point);
    
            int sy = min_y+test_boundary;
            int ey = max_y-test_boundary;
    
            bool bound_check = (ey-sy)>test_boundary;
            bool rb;
    
            int min_v,max_v;
    
            if (bound_check)
            {
                int diff=ey-sy;
                double ds=(double)(diff/mri);
                if(mri>1&&(ds<=test_boundary))
                {
                    while(mri>1&&(ds<=test_boundary))
                    {
                        ri--;
                        mri--;
                        ds=(double)(diff/mri);
                    }
                }
                if(((test_boundary>0)||(diff>0))?(ds>(double)(test_boundary)):true)
                {
                    int p=min_x;
                    for(int ri_ind=0; ri_ind<ri ; ri_ind++)
                    {
                        rb=myRandom.Next(0,99)>(probability-1);
                        if (ri_ind==mri)
                        {
                            if (p>max_y)
                            {
                                p=max_y;
                                if((max_x-min_x)==0){rb=true;}
                            }
                            if (rb || (itern==max_iter))
                            {
                                Unmodifiable_Rect.Add((min_x,max_x,p,max_y,itern));
                            }
                            else
                            {
                                Modifiable_Rect.Add((min_x,max_x,p,max_y,itern));
                            }
    
                        }
                        else
                        {
                            if(ri_ind==0)
                            {
                                my=(int)(Math.Round((double)(sy+ds)));
                                min_v=Math.Min(p,my);
                                max_v=Math.Max(p,my);
                                np=Math.Min(Math.Max(sy,myRandom.Next(min_v,max_v)),ey);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((min_x,max_x,p,np,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((min_x,max_x,p,np,itern));
                                }
                                p=np+1;
                                if(p>=ey){skip=true;}
                            }
                            else
                            {
                                if(skip){continue;}
                                my=(int)(Math.Round((double)(my+ds)));
                                min_v=Math.Min(p,my+1);
                                max_v=Math.Max(p,my+1);
                                np=Math.Min(Math.Max(p+border_size,myRandom.Next(min_v,max_v)),ey);
                                if (rb || (itern==max_iter))
                                {
                                    Unmodifiable_Rect.Add((min_x,max_x,Math.Min(p,ey),np,itern));
                                }
                                else
                                {
                                    Modifiable_Rect.Add((min_x,max_x,Math.Min(p,ey),np,itern));
                                }
                                p=np+1;
                            }
                        }
                    }
                }
                else
                {
                    Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
                }
            }
            else
            {
                Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,itern));
            }
    }
    
    void PreRender(Surface dst, Surface src)
    {
    
        if (Rectangles_Surface==null)
        {
            Modifiable_Rect.RemoveRange(0,1);
            Unmodifiable_Rect.RemoveRange(0,1);
            Rectangles_Surface=new ColorBgra [src.Width,src.Height];
        }
        else
        {
            Modifiable_Rect.RemoveRange(0,Modifiable_Rect.Count);
            Unmodifiable_Rect.RemoveRange(0,Unmodifiable_Rect.Count);
            Array.Clear(Rectangles_Surface,0,src.Width*src.Height);
        }
    
        if (new_seed != seed)
        {
            Modifiable_Rect.RemoveRange(0,Modifiable_Rect.Count);
            Unmodifiable_Rect.RemoveRange(0,Unmodifiable_Rect.Count);
            myRandom = Seed;
        }
        else
        {
            myRandom = new Random(int.MaxValue);
        }
    
        new_seed = seed;
    
        int width  = src.Width  - 1;
        int height = src.Height - 1;
        int border_size;
        int test_boundary;
    
        if (init_add_thick>0)
        {
            border_size=init_add_thick+1;
            test_boundary=border_size+1;
        }
        else{
            border_size=0;
            test_boundary=0;
        }
    
        bool width_check=diff_check(width-border_size*2);
        bool height_check=diff_check(height-border_size*2);
    
        if (width_check||height_check){
            pass = true;
            Modifiable_Rect.Add((0,width,0,height,0));
    
            //split_row(0,test_boundary,border_size);
    
            if (width_check&&height_check)
            {
                if (myRandom.Next(0,2)==0)
                {
                    split_column(0,test_boundary,border_size);
                }
                else
                {
                    split_row(0,test_boundary,border_size);
                }
            }
            else
            {
                if (height_check)
                {
                    split_column(0,test_boundary,border_size);
                }
                else
                {
                    split_row(0,test_boundary,border_size);
                }
            }
    
            int arr_point=0;
            int p_ind;
    
            while(Modifiable_Rect.Count>0){
                p_ind=myRandom.Next(Modifiable_Rect.Count);
                if(myRandom.Next(0,2)==0)
                {
                    split_column(p_ind,test_boundary,border_size);
                }
                else
                {
                    split_row(p_ind,test_boundary,border_size);
                }
                arr_point++;
                if(arr_point>=max_loop){break;}
            }
    
    
            int new_min_x;
            int new_max_x;
            int new_min_y;
            int new_max_y;
            int nv=0;
    
            int ex,ey;
    
            ColorBgra Temp_Color;
    
            int tr,tg,tb;
    
            if (Modifiable_Rect.Count>0)
            {
                for (int i = 0 ; i < Modifiable_Rect.Count ; i++){
                    new_min_x=Modifiable_Rect[i].Item1;
                    new_max_x=Modifiable_Rect[i].Item2;
                    new_min_y=Modifiable_Rect[i].Item3;
                    new_max_y=Modifiable_Rect[i].Item4;
                    ex = new_max_x+1;
                    ey = new_max_y+1;
                    tr=myRandom.Next(256);
                    tg=myRandom.Next(256);
                    tb=myRandom.Next(256);
                    for (int x = new_min_x ; x<ex ; x++)
                    {
                        for (int y = new_min_y ; y<ey ; y++)
                        {
                            Rectangles_Surface[x,y]=ColorBgra.FromBgr((byte)(tb),(byte)(tg),(byte)(tr));
                        }
                    }
                    nv++;
                }
            }
    
            if (Unmodifiable_Rect.Count>0)
            {
                for (int j = 0 ; j < Unmodifiable_Rect.Count ; j++)
                {
                    new_min_x=Unmodifiable_Rect[j].Item1;
                    new_max_x=Unmodifiable_Rect[j].Item2;
                    new_min_y=Unmodifiable_Rect[j].Item3;
                    new_max_y=Unmodifiable_Rect[j].Item4;
                    ex=new_max_x+1;
                    ey=new_max_y+1;
                    tr=myRandom.Next(256);
                    tg=myRandom.Next(256);
                    tb=myRandom.Next(256);
                    for (int x = new_min_x ; x<ex ; x++)
                    {
                        for (int y = new_min_y ; y<ey ; y++)
                        {
                            Rectangles_Surface[x,y]=ColorBgra.FromBgr((byte)(tb),(byte)(tg),(byte)(tr));
                        }
                    }
                    nv++;
                }
            }
    
        }
    }
    
    void Render(Surface dst, Surface src, Rectangle rect)
    {
        // Delete any of these lines you don't need
    
        if (pass)
        {
            for (int y = rect.Top; y < rect.Bottom; y++)
            {
                if (IsCancelRequested) return;
                for (int x = rect.Left; x < rect.Right; x++)
                {
                    dst[x,y] = Rectangles_Surface[x,y];
                }
            }
        }
    }

     

    Based off this working G'MIC code:

    #@cli rep_rrd: eq. to 'rep_random_rectangular_division' : (+)
    rep_rrd: rep_random_rectangular_division $*
    #@cli rep_random_rectangular_division: split>1,_additional_thickness>=0,_max_iter>=2,_probability[%]>0,_loop_limit>1,_seed
    #@cli : Generate random division of rectangle as in random number of division and varying thickness within rectangle.
    #@cli : _additional_thickness refers to the excess pixel thickness.
    #@cli : _max_iter limits the number of iterations per rectangle.
    #@cli : _probability determines the probability that a rectangle will be permitted to be utilized for further iteration.
    #@cli : _loop_limit limits the number of time the process of subdivision is done.
    #@cli : _seed generates the output based on defined parameter.
    #@cli : Default values: '_gen_thick=0','_max_iter=5','_probability[%]=95%','_loop_limit=5000','_seed=n/a'
    rep_random_rectangular_division:
    skip ${2=0},${3=5},${4=95%},${5=5000},${6=}
    check "$4>0"
    repeat $! l[$>]
     _rep_random_rectangular_division $*
    endl done
    _rep_random_rectangular_division:
    skip ${2=0},${3=5},${4=95%},${5=5000},${6=}
     
    r 100%,100%,1,1 #You can ignore this.
     
    1,1,1,5 #Modifiable Rectangle Array
    1,1,1,5 #Unmodifiable Rectangle Array
     
    eval ${-math_lib}"
     if(narg($6),srand($6););
     const ww=w#-3-1; #Width of Image
     const hh=h#-3-1; #Height of Image
     const max_split=max(1,int(abs($1)));                   #Number of Split per Rectangle
     const internal_space=int(abs($2));                     #Additional paces between Split
     const test_boundary=internal_space?(internal_space+1); #Test if rectangle is acceptable to split
     const max_iter=max(2,round(abs($3)));                  #Maximum Iteration
     const odd=cut($4,0,1);                                 #Probability of splitting rectangle
     const arr_limit=round(abs($5));                        #The limit of looping to split rectangle
     
     diff_check(a)=( #diff_check(a) is a function
      mri=max_split;
      ds=a/mri;
      if(mri>1&&ds<1,
       while(mri>1&&ds<1,
        mri--;
        ds=a/mri;
       );
      );
      ds>1;
     );
     
     width_check=diff_check(ww-internal_space*2); # Determine if the width of image is reasonable with parameters assigne
     height_check=diff_check(hh-internal_space*2); # Determine if the height of image is reasonable with parameters assigne
     
     !(width_check||height_check)?run('error inv_dim'); #If neither are reasonable, then throws a error
     
     dar_insert(#-2,[0,ww,0,hh,0]);   #Insert the dimensions of image and the first iteration number which is 0 into the modifiable array
     
     sub_column(v,point)=(            #Function to Split Rectangle
      ri=int(u(1,max_split))+1;       #Number of Division
      mri=ri-1;                       #Maximum Division Iteration
      sx=v[0]+test_boundary;          #Start Point for Next Split
      ex=v[1]-test_boundary;          #End Gap between the End Index and the start of the final Split
      diff=ex-sx;                     #Difference between the Two
      bound_check=diff>test_boundary; #Check the boundary between two, if fails, send it to the un-modifiable rectangle array
      skip=0;                         #Boolean Value of skip
      dar_remove(#-2,point);          #Remove Rectangle Information at point
      if(bound_check,                 #If Bound Check
       ds=diff/mri;                   #The length of diff divided by the maximum-iteration number.
       if(mri>1&&ds<=test_boundary,   #Check if the distance is smaller than test_boundary. If fail, then send to unmodifiable rectangle array
        while(mri>1&&ds<=test_boundary, #Used to find the minimum mri to reach size greater than test_bounary
         ri--;
         mri--;
         ds=diff/mri;
        );
       );
       if(test_boundary||diff?(ds>test_boundary):1, #If condition meets, then it will modify the rectangle. Otherwise, send it to unmodifiable
        py=[v[2],v[3]];   #Two Variable inserted as one. Used for simplifying Code
        iter=v[4]+1;      #The current iteration number of rectangle plus 1. Used for stopping splitting at iteration-n
        p=v[0];           #Start at min-x of rectangle
        repeat(ri,ri_ind, #Repeat ri time, and ri_ind is the number of used as iterator
         rb=odd<1?u(0,1)>odd:0; #The probability of a rectangle will be modifiable or not
         ri_ind==mri?( #Meets the last iteration of ri loop
          if(p>v[1],
           p=v[1];
           if(!(v[3]-v[2]),rb=1;); #If the pixel dimension is equal to 1, it no longer becomes modifiable
          );
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[p,v[1],py,iter]); #Send to unmodifiable
          ):(
           dar_insert(#-2,[p,v[1],py,iter]); #Send to modifiable
          );
         ):
         !ri_ind?(
          mx=sx+ds;
          np=min(max(sx,round(u(p,mx))),ex);
          vp=[p,np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[vp,py,iter]);
          ):(
           dar_insert(#-2,[vp,py,iter]);
          );
          p=np+1;
          if(p>=ex,skip=1;);
         ):(
          if(skip,continue(););
          mx+=ds;
          np=min(max(p+internal_space,round(u(p,mx))),ex);
          vp=[min(p,ex),np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[vp,py,iter]);
          ):(
           dar_insert(#-2,[vp,py,iter]);
          );
          p=np+1;
         );
        );
       ,dar_insert(#-1,v);
       );
      ,dar_insert(#-1,v);
      );
     );
     
     sub_row(v,point)=(
      ri=int(u(1,max_split))+1;
      mri=ri-1;
      sy=v[2]+test_boundary;
      ey=v[3]-test_boundary;
      diff=ey-sy;
      bound_check=diff>test_boundary;
      skip=0;
      dar_remove(#-2,point);
      if(bound_check,
       ds=diff/mri;
       if(mri>1&&ds<=test_boundary,
        while(mri>1&&ds<=test_boundary,
         ri--;
         mri--;
         ds=diff/mri;
        );
       );
       if(test_boundary||diff?(ds>test_boundary):1,
        px=[v[0],v[1]];
        iter=v[4]+1;
        p=v[2];
        repeat(ri,ri_ind,
         rb=odd<1?u(0,1)>odd:0;
         ri_ind==mri?(
          if(p>v[3],
           p=v[3];
           if(!(v[1]-v[0]),rb=1;);
          );
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[px,p,v[3],iter]);
          ):(
           dar_insert(#-2,[px,p,v[3],iter]);
          );
         ):
         !ri_ind?(
          my=sy+ds;
          np=min(max(sy,round(u(p,my))),ey);
          vp=[p,np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[px,vp,iter]);
          ):(
           dar_insert(#-2,[px,vp,iter]);
          );
          p=np+1;
          if(p>=ey,skip=1;);
         ):(
          if(skip,continue(););
          my+=ds;
          np=min(max(p+internal_space,round(u(p,my))),ey);
          vp=[min(p,ey),np];
          (rb||(iter==max_iter))?(
           dar_insert(#-1,[px,vp,iter]);
          ):(
           dar_insert(#-2,[px,vp,iter]);
          );
          p=np+1;
         );
        );
       ,dar_insert(#-1,v);
       );
      ,dar_insert(#-1,v);
      );
     );
     
     
     v=I[#-2,0];
     
     width_check&&height_check?(
      u(0,1)<=.5?(
       sub_row(v,0);
      ):(
       sub_column(v,0);
      );
     ):
     width_check?(
      sub_column(v,0);
     ):
     height_check?(
      sub_row(v,0);
     );
     
     arr_point=0;
     
     while(dar_size(#-2),
      p_ind=int(u(dar_size(#-2)));
      cv=I[#-2,p_ind];
      u(0,1)<.5?(
       sub_row(cv,p_ind);
      ):(
       sub_column(cv,p_ind);
      );
      arr_point++;
      if(arr_point>=arr_limit,break());
     );
     
     resize(#-2,1,dar_size(#-2),1,4,0);
     resize(#-1,1,dar_size(#-1),1,4,0);"
     
    a[-2,-1] y
     
    eval. :"begin(
      convert2coords(c)=(
       tl=[c[0],c[2]];
       tr=[c[1],c[2]];
       bl=[c[0],c[3]];
       br=[c[1],c[3]];
       [tl,tr,br,bl];
      );
     );
     polygon(#-2,4,convert2coords(I),1,y);"
     
    rm.

     

  7. Right now, I have a near complete code.

     

    The only problem is that DEBUG shows ModifiableRect[0] outputs (0,0,0,0,0). If that wasn't the case, then the code should work in theory.

     

    The idea is to create array containing rectangles, and the voids modify existing rectangle and insert new array of rectangles. iter means number of iteration of splitting.

     

    Some questions:

    1. Is the binary Random condition coded in here is correct? myRandom(2)==0?

    2. Any reason why it outputs a blank image?

     

    Spoiler
    // Name:
    // Submenu:
    // Author:
    // Title:
    // Version:
    // Desc:
    // Keywords:
    // URL:
    // Help:
    #region UICode
    IntSliderControl max_divide = 10; // [1,20] Division
    IntSliderControl init_add_thick = 0; // [0,100] Additional Thickness
    IntSliderControl max_iter = 5; // [2,40] Maximum Division Iteration
    IntSliderControl probability = 95; // [0,100] Probability of Division(%)
    IntSliderControl max_loop = 2000; // [1000,2097152] Loop Limit
    DoubleSliderControl border = 10; // [0,100] Border(%)
    ReseedButtonControl seed = 0; // Reseed
    #endregion
    #if DEBUG
    #endif
    
    int[,] Rectangles_Surface;
    
    Random Seed = new Random();
    int new_seed;
    
    List<(int,int,int,int,int)> Modifiable_Rect = new List<(int,int,int,int,int)>{
                (0,0,0,0,0)
    };
    
    List<(int,int,int,int,int)> Unmodifiable_Rect = new List<(int,int,int,int,int)>{
                (0,0,0,0,0)
    };
    
    bool diff_check(int a)
    {
        int mri = max_divide;
        double ds = (double)(a/mri);
        if (mri>1&&(ds<1)){
            while(mri>1&&(ds<1)){
                mri--;
                ds = (double)(a/mri);
            }
        }
    
        return ds>1;
    }
    
    void divide_column(int point,int border_size,int test_boundary,Random rand){
        int ri = rand.Next(1,max_divide)+1;
        int mri = ri-1;
        int min_x=Modifiable_Rect[point].Item1;
        int max_x=Modifiable_Rect[point].Item2;
        int min_y=Modifiable_Rect[point].Item3;
        int max_y=Modifiable_Rect[point].Item4;
        int iter=Modifiable_Rect[point].Item5 + 1;
        int sx = min_x+test_boundary;
        int ex = max_x+test_boundary;
        bool bound_check = (ex-sx)>test_boundary;
        bool skip = false;
        double mx,d_np;
        int np;
        Modifiable_Rect.RemoveAt(point);
        if(bound_check)
        {
            int diff = (ex-sx);
            double ds=(double)(diff/mri);
            if(mri>1&&(ds<=(double)(test_boundary)))
            {
                while(mri>1&&(ds<=(double)(test_boundary)))
                {
                    ri--;
                    mri--;
                    ds=(double)(diff/mri);
                }
            }
            bool process = (test_boundary>0)||(diff>0)?(ds>(double)(test_boundary)):true;
            if (process)
            {
                int p=min_x;
                mx=(double)(p);
                for (int ri_ind= 0 ; ri_ind < ri ; ri_ind++){
                    bool rb = probability<100?(rand.Next(100)>probability):false;
                    if (ri_ind==mri)
                    {
                        if(p>max_x){
                            p=max_x;
    
                            if((max_y-min_y)==0){rb=true;}
    
                            if (rb || iter==max_iter)
                            {
                                Modifiable_Rect.Add((p,max_x,min_y,max_y,iter));
                            }
                            else
                            {
                                Unmodifiable_Rect.Add((p,max_x,min_y,max_y,iter));
    
                            }
                        }
                    }
                    else
                    {
                        if(ri_ind==0)
                        {
                            mx+=ds;
                            d_np=Math.Min(Math.Max(sx,rand.Next(p,(int)(Math.Round(mx)))),ex);
                            np=(int)(Math.Round(d_np));
                            if (rb || iter==max_iter)
                            {
                                Modifiable_Rect.Add((p,np,min_y,max_y,iter));
                            }
                            else
                            {
                                Unmodifiable_Rect.Add((p,np,min_y,max_y,iter));
    
                            }
                            p=np+1;
                            if(p>=ex)
                            {
                                skip = true;
                            }
    
                        }
                        else
                        {
                            if(skip){continue;}
                            mx+=ds;
                            d_np=Math.Min(Math.Max(p+border_size,rand.Next(p,(int)(Math.Round(mx)))),ex);
                            np=(int)(Math.Round(d_np));
                            if (rb || iter==max_iter)
                            {
                                Modifiable_Rect.Add((p,np,min_y,max_y,iter));
                            }
                            else
                            {
                                Unmodifiable_Rect.Add((p,np,min_y,max_y,iter));
                            }
                        }
                    }
                }
            }
            else
            {
                Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,iter));
            }
    
        }
        else
        {
            Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,iter));
        }
    }
    
    void divide_row(int point,int border_size,int test_boundary,Random rand){
        int ri = rand.Next(1,max_divide)+1;
        int mri = ri-1;
        int min_x=Modifiable_Rect[point].Item1;
        int max_x=Modifiable_Rect[point].Item2;
        int min_y=Modifiable_Rect[point].Item3;
        int max_y=Modifiable_Rect[point].Item4;
        int iter=Modifiable_Rect[point].Item5 + 1;
        int sy = min_y+test_boundary;
        int ey = max_y+test_boundary;
        bool bound_check = (ey-sy)>test_boundary;
        bool skip = false;
        double my,d_np;
        int np;
        Modifiable_Rect.RemoveAt(point);
        if(bound_check)
        {
            int diff = (ey-sy);
            double ds=(double)(diff/mri);
            if(mri>1&&(ds<=(double)(test_boundary)))
            {
                while(mri>1&&(ds<=(double)(test_boundary)))
                {
                    ri--;
                    mri--;
                    ds=(double)(diff/mri);
                }
            }
            bool process = (test_boundary>0)||(diff>0)?(ds>(double)(test_boundary)):true;
            if (process)
            {
                int p=min_y;
                my=(double)(p);
                for (int ri_ind= 0 ; ri_ind < ri ; ri_ind++){
                    bool rb = probability<100?(rand.Next(100)>probability):false;
                    if (ri_ind==mri)
                    {
                        if(p>max_x){
                            p=max_y;
    
                            if((max_x-min_x)==0){rb=true;}
    
                            if (rb || iter==max_iter)
                            {
                                Modifiable_Rect.Add((min_x,max_x,p,max_y,iter));
                            }
                            else
                            {
                                Unmodifiable_Rect.Add((min_x,max_x,p,max_y,iter));
    
                            }
                        }
                    }
                    else
                    {
                        if(ri_ind==0)
                        {
                            my+=ds;
                            d_np=Math.Min(Math.Max(sy,rand.Next(p,(int)(Math.Round(my)))),ey);
                            np=(int)(Math.Round(d_np));
                            if (rb || iter==max_iter)
                            {
                                Modifiable_Rect.Add((min_x,max_y,p,np,iter));
                            }
                            else
                            {
                                Unmodifiable_Rect.Add((min_x,max_y,p,np,iter));
    
                            }
                            p=np+1;
                            if(p>=ey)
                            {
                                skip = true;
                            }
    
                        }
                        else
                        {
                            if(skip){continue;}
                            my+=ds;
                            d_np=Math.Min(Math.Max(p+border_size,rand.Next(p,(int)(Math.Round(my)))),ey);
                            np=(int)(Math.Round(d_np));
                            if (rb || iter==max_iter)
                            {
                                Modifiable_Rect.Add((min_x,min_y,p,np,iter));
                            }
                            else
                            {
                                Unmodifiable_Rect.Add((min_x,min_y,p,np,iter));
                            }
                        }
                    }
                }
            }
            else
            {
                Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,iter));
            }
    
        }
        else
        {
            Unmodifiable_Rect.Add((min_x,max_x,min_y,max_y,iter));
        }
    }
    
    bool pass=false;
    
    void PreRender(Surface dst, Surface src)
    {
    
        if (Rectangles_Surface==null){
            Rectangles_Surface=new int [src.Width,src.Height];
        }
    
        Random myRandom;
    
        if (new_seed != seed)
        {
            myRandom = Seed;
        }
        else
        {
            myRandom = new Random(int.MaxValue);
        }
    
        new_seed = seed;
    
        int width  = src.Width  - 1;
        int height = src.Height - 1;
        int border_size;
        int test_boundary;
    
        if (init_add_thick>0)
        {
            border_size=init_add_thick+1;
            test_boundary=border_size+1;
        }
        else{
            border_size=0;
            test_boundary=0;
        }
    
        bool width_check=diff_check(width-border_size*2);
        bool height_check=diff_check(height-border_size*2);
    
        if (width_check||height_check){
            pass = true;
            Unmodifiable_Rect.RemoveAt(0);
            Modifiable_Rect.Add((0,width,0,height,0));
            Debug.WriteLine(Modifiable_Rect[0]);
            Modifiable_Rect.RemoveAt(0);
            if (width_check&&height_check)
            {
                if(myRandom.Next(2)==0)
                {
                    divide_row(0,border_size,test_boundary,myRandom);
                }
                else
                {
                    divide_column(0,border_size,test_boundary,myRandom);
                }
            }
            else
            {
                if(height_check)
                {
                    divide_row(0,border_size,test_boundary,myRandom);
                }
                else
                {
                    divide_column(0,border_size,test_boundary,myRandom);
                }
            }
            
            int arr_point=0;
            int p_ind,sx,sy,mx,my;
    
            while(Modifiable_Rect.Count>0)
            {
                p_ind=myRandom.Next(Modifiable_Rect.Count-1);
                if(myRandom.Next(2)==0)
                {
                    divide_row(p_ind,border_size,test_boundary,myRandom);
                }
                else
                {
                    divide_column(p_ind,border_size,test_boundary,myRandom);
                }
                arr_point++;
                if(arr_point>=max_loop){break;}
            }
    
            if(Modifiable_Rect.Count>0){
                for(int i = 0 ; i < Modifiable_Rect.Count ; i++){
                    sx = Modifiable_Rect[i].Item1;
                    sy = Modifiable_Rect[i].Item2;
                    mx = Modifiable_Rect[i].Item3 + 1;
                    my = Modifiable_Rect[i].Item4 + 1;
                    for (int x = sx ; x < mx ; x++){
                        for (int y = sy ; y < my ; y++){
                            Rectangles_Surface[x,y]=i;
                        }
                    }
                }
            }
            if(Unmodifiable_Rect.Count>0){
                for(int i = 0 ; i < Unmodifiable_Rect.Count ; i++){
                    sx = Unmodifiable_Rect[i].Item1;
                    sy = Unmodifiable_Rect[i].Item2;
                    mx = Unmodifiable_Rect[i].Item3 + 1;
                    my = Unmodifiable_Rect[i].Item4 + 1;
                    for (int x = sx ; x < mx ; x++){
                        for (int y = sy ; y < my ; y++){
                            Rectangles_Surface[x,y]=i;
                        }
                    }
                }
            }
        }
    }
    
    void Render(Surface dst, Surface src, Rectangle rect)
    {
        // Delete any of these lines you don't need
        Rectangle selection = EnvironmentParameters.SelectionBounds;
        int centerX = ((selection.Right - selection.Left) / 2) + selection.Left;
        int centerY = ((selection.Bottom - selection.Top) / 2) + selection.Top;
        ColorBgra primaryColor = EnvironmentParameters.PrimaryColor;
        ColorBgra secondaryColor = EnvironmentParameters.SecondaryColor;
        int brushWidth = (int)EnvironmentParameters.BrushWidth;
        int val;
    
        ColorBgra currentPixel;
        for (int y = rect.Top; y < rect.Bottom; y++)
        {
            if (IsCancelRequested) return;
            for (int x = rect.Left; x < rect.Right; x++)
            {
                currentPixel = src[x,y];
                val = Rectangles_Surface[x,y];
                dst[x,y] = ColorBgra.FromBgra((byte)(val),(byte)(val),(byte)(val),255);
            }
        }
    }

     

     

  8. Here's the problem I have. How to add to Image_Rect list?

     

    List<(int,int,int,int,int)> Image_Rect = new List<(int,int,int,int,int)>();
    Image_Rect.Add(Tuple((100,0,100,0,5)));

    The above don't work.

     

    What I'm trying to do is create 2 set of dynamic array of fixed size array of size 5, and to be able to access each variable at index n and to remove at index n. In addition to that, I would like to be able to use functions on it to replace the n index. Any idea?

  9. Some of you may noticed bugs that are cropping up. Please do not be alarmed, I'm in the process of refactoring code.

     

    For non-programmers, this means making code easier to comprehend, and reducing reductive lines.

     

    So, these bugs will be fixed, but I do need cooperation. If you can find bugs, do tell them to me, and they will be addressed.

    • Upvote 2
×
×
  • Create New...