ছোট ডায়মন্ড স্কোয়ার অ্যালগোরিদম


12

হীরা স্কোয়ার অ্যালগরিদম হ'ল একটি ফ্র্যাক্টাল টেরিন (হাইটম্যাপ) উত্পাদিত অ্যালগরিদম। এটি এখানে কীভাবে কাজ করে তা আপনি একটি সুন্দর বর্ণনা পেতে পারেন:

http://www.gameprogrammer.com/fractal.html (একটি রেফারেন্স হিসাবে ব্যবহৃত হয়।)

http://www.playfuljs.com/realistic-terrain-in-130-lines/ (গ্রেট জেএস বাস্তবায়ন, সম্ভবত আপনি তাঁর রেন্ডারার চুরি করতে চাইতে পারেন this এই অ্যালগরিদমটি http: // ডেমোতে সক্ষম কি তা এখানে একবার দেখুন । playfuljs.com/terrain/ ।)

সাধারণ ধারণাটি হ'ল আপনার কাছে 4 টি কোণ বীজ হিসাবে রয়েছে (ক), এবং এই চারটি কোণার গড় গড় করে এবং এলোমেলো মান যেমন -0.5 এবং 0.5 (খ) এর মধ্যে যুক্ত করে কেন্দ্র বিন্দুর উচ্চতা গণনা করুন। আপনি যদি গ্রিডে এটি প্রয়োগ করেন তবে আপনি আবার হীরার গ্রিড পাবেন (বর্গক্ষেত্র 45 °) এবং আপনি একই (সি, ডি) পুনরাবৃত্তি করতে পারেন, তবে এলোমেলো পরিসীমা আরও ছোট হয়ে যায়, যেমন -0.125 থেকে 0.125 ইত্যাদি এখানে চিত্র বর্ণনা লিখুন

আপনার প্রোগ্রামটি অবশ্যই বেশ কয়েকটি ইনপুট গ্রহণ করবে:

  • একটি পূর্ণসংখ্যা l=1,2,3,...যা পাশের দৈর্ঘ্য সহ বর্গাকার গ্রিডের আকার নির্ধারণ করে 2^l+1। এ l=10আপনার সম্পর্কে এক মিলিয়ন নম্বর সংরক্ষণ করতে হবে।
  • প্রতিটি কোণার জন্য চারটি বীজ (ভাসমান পয়েন্ট)
  • একটি প্যারামিটার 0<h<1যা রুক্ষতা নির্ধারণ করে ( Hলিঙ্কে) যার অর্থ এলোমেলো পরিসীমা শুরুতে কত বড়
  • প্যারামিটারগুলি a,bযা এলোমেলো ব্যাপ্তির জন্য প্রাথমিক নিম্ন এবং উচ্চতর সীমাকে উপস্থাপন করে hএবং প্রতিটি পরিশোধক পদক্ষেপে গুণিত হয় । (এলোমেলো সংখ্যাটি aএবং এর মধ্যে সমানভাবে চয়ন করা হয় b

আউটপুট অবশ্যই 2 ডি গ্রিড সমাপ্ত হতে হবে।

সুতরাং রুক্ষ অ্যালগরিদমটি দেখতে এটির মতো হবে:

Create a square grid with sidelength 2^l+1
Place seed values in the corners
Repeat:
  |  Perform square steps
  |  Refine Range: a = a*h; b=b*h;
  |  Perform diamond steps
  |  Refine Range

আপনার একটি সচেতন হওয়া উচিত এমন একটি বিবরণ রয়েছে: গ্রিডের সীমানায়, আপনার কাছে হীরাটির কেবল তিনটি শীর্ষবিন্দু থাকবে , সুতরাং আপনার কেবল তিনটি পয়েন্টের গড় গণনা করা উচিত।

কিছু উদাহরণের ভিজ্যুয়ালাইজেশন (দয়া করে আপনি কী প্যারামিটার ব্যবহার করেছেন তা আমাদের বলুন) optionচ্ছিক তবে প্রশংসাযোগ্য, এবং অবশ্যই বাইট গণনায় যুক্ত হয় না।

এই অ্যালগরিদমের সামান্য বৈচিত্রময় বাস্তবায়ন এখানে পাওয়া যাবে: সমান্তরাল অভিক্ষিপ্ত ভক্সেল ভূখণ্ড জেনারেটর

গ্রেস্কেল চিত্র হিসাবে 2 ডি তে উচ্চতা ম্যাপগুলি বিভক্ত করার জন্য আমি জাভাস্ক্রিপ্টে একটি ছোট অঙ্কন ফাংশন তৈরি করেছি। http://jsfiddle.net/flawr/oy9kxpsx/

যদি আপনার মধ্যে কেউ যদি অভিনব 3 ডি হয় এবং 3 ডি তে মানচিত্র দেখতে স্ক্রিপ্ট তৈরি করতে পারেন তবে আমাকে জানান! =)

উত্তর:


8

জাভা, 1017 বাইট

ইনপুট একটি স্থান তাই মত তালিকা পৃথক হল: l s1 s2 s3 s4 h a b

আউটপুট হ'ল একটি 2-অ্যারে সংখ্যার সমন্বিত।

কার্যক্রম:

import java.util.*;import static java.lang.Math.*;class C{public static void main(String[]a){int b=a.length,d=0;float[]c=new float[b];for(;d<b;){c[d]=Float.parseFloat(a[d++]);}e=(int)(pow(2,c[0])+1);f=new float[e][e];f[0][0]=c[1];f[0][e-1]=c[2];f[e-1][0]=c[3];f[e-1][e-1]=c[4];g=c[5];float h=c[6],i=c[7];s(0,0,e-1,e-1,h,i);System.out.print(Arrays.deepToString(f));}static int e;static float[][]f;static float g;static void s(int q,int r,int s,int t,float h,float i){if(s-q<2|t-r<2|q<0|r<0|s>=e|t>=e)return;float o,p;int m=(q+s)/2,n=(r+t)/2;f[m][n]=(float)(a(q,r,s,r,q,t,s,t)+random()*(i-h)-h);d(m,r,m-q,o=h*g,p=i*g);d(q,n,m-q,o,p);d(m,t,m-q,o,p);d(s,n,m-q,o,p);}static void d(int x,int y,int e,float h,float i){float o,p;f[x][y]=(float)(a(x,y-e,x+e,y,x,y+e,x-e,y)+random()*(i-h)-h);s(x-e,y-e,x,y,o=h*g,p=i*g);s(x,y-e,x+e,y,o,p);s(x-e,y,x,y+e,o,p);s(x,y,x+e,y+e,o,p);}static float a(int...j){float k=0,l=0;for(int d=0;d<j.length;d+=2){if(j[d]<0|j[d+1]<0|j[d]>=e|j[d+1]>=e)continue;l++;k+=f[j[d]][j[d+1]];}return k/l;}}

প্রোগ্রামটি ইন্টেন্টেড এবং মানচিত্রটি প্রদর্শন করে:

import java.util.*;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import static java.lang.Math.*;

class D{

    public static void main(String[]a){
        int b=a.length,d=0;
        float[]c=new float[b];
        for(;d<b;){
            c[d]=Float.parseFloat(a[d++]);
        }
        e=(int)(pow(2,c[0])+1);
        f=new float[e][e];
        f[0][0]=c[1];
        f[0][e-1]=c[2];
        f[e-1][0]=c[3];
        f[e-1][e-1]=c[4];
        g=c[5];
        float h=c[6],i=c[7];
        s(0,0,e-1,e-1,h,i);
        showImage(f);
    }

    static int e;
    static float[][]f;
    static float g;

    static void s(int q,int r,int s,int t,float h,float i){
        if(s-q<2|t-r<2|q<0|r<0|s>=e|t>=e)
            return;
        float o,p;
        int m=(q+s)/2,n=(r+t)/2;
        f[m][n]=(float)(a(q,r,s,r,q,t,s,t)+random()*(i+h)-h);
        d(m,r,m-q,o=h*g,p=i*g);
        d(q,n,m-q,o,p);
        d(m,t,m-q,o,p);
        d(s,n,m-q,o,p);
    }

    static void d(int x,int y,int e,float h,float i){
        float o,p;
        f[x][y]=(float)(a(x,y-e,x+e,y,x,y+e,x-e,y)+random()*(i-h)+h);
        s(x-e,y-e,x,y,o=h*g,p=i*g);
        s(x,y-e,x+e,y,o,p);
        s(x-e,y,x,y+e,o,p);
        s(x,y,x+e,y+e,o,p);
    }

    static float a(int...j){
        float k=0,l=0;
        for(int d=0;d<j.length;d+=2){
            if(j[d]<0|j[d+1]<0|j[d]>=e|j[d+1]>=e)
                continue;
            l++;
            k+=f[j[d]][j[d+1]];
        }
        return k/l;
    }

    public static void showImage(float[][] f){
        float maxHeight = Float.MIN_VALUE;
        float minHeight = Float.MAX_VALUE;
        for (float[] row : f){
            for (float height : row){
                if (height > maxHeight){
                    maxHeight = height;
                }
                if (height < minHeight){
                    minHeight = height;
                }
            }
        }
        int e = f.length;
        BufferedImage image = new BufferedImage(e, e, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < e; x++){
            for (int y = 0; y < e; y++){
                Color color = Color.getHSBColor((float)((f[x][y] - minHeight)/(maxHeight - minHeight)), 1, 1);
                image.setRGB(x,y,color.getRGB());
            }
        }
        JFrame frame = new JFrame("Picture");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JComponent(){

            @Override
            public void paint(Graphics g){
                g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
            }

        });
        frame.setVisible(true);
        frame.setBounds(0,0,e,e);
    }

}

এখানে একটি মানচিত্র দেখানোর জন্য জাভাতে একটি ফাংশন রয়েছে:

public static void showImage(float[][] map){
    float maxHeight = Float.MIN_VALUE;
    float minHeight = Float.MAX_VALUE;
    for (float[] row : map){
        for (float height : row){
            if (height > maxHeight){
                maxHeight = height;
            }
            if (height < minHeight){
                minHeight = height;
            }
        }
    }
    int size = map.length;
    BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
    for (int x = 0; x < size; x++){
        for (int y = 0; y < size; y++){
            Color color = Color.getHSBColor((float)((map[x][y] - minHeight)/(maxHeight - minHeight)), 1, 1);
            image.setRGB(x,y,color.getRGB());
        }
    }
    JFrame frame = new JFrame("Picture");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JComponent(){

        @Override
        public void paint(Graphics g){
            g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        }

    });
    frame.setVisible(true);
    frame.setBounds(0,0,size,size);
}

এই সমস্ত চিত্রের একটি আকার আছে 7। 4 বীজ হয় 5, 10, 15, এবং 20

aএবং bহয় -10এবং 10যথাক্রমে।

এ বন্ধুরতা শুরু .1এবং বাড়তি দ্বারা .1পর্যন্ত 1

একদুইতিনচারপাঁচছয়সাতআটনয়দশ

ভূখণ্ডের উত্পাদন কোড শীঘ্রই আসছে !!!

ছবি শীঘ্রই আসছে !!!


আপনাকে অনেক ধন্যবাদ! আপনি সম্ভবত প্রয়োজনীয় সমস্ত আমদানি সহ কোনও ক্লাস সরবরাহ করতে পারেন যাতে কোনও বড় পরিবর্তন করার প্রয়োজন হয় না? এইটা চমৎকার হবে!
flawr

@ ফ্লোয়ার আমি এতে কাজ করছি
দ্য নম্বরওয়ে

এটি ঠিকভাবে কাজ করে চলেছে, আপনি কীভাবে এটি করতে জানেন তা যদি আপনি উইন্ডোটিকে 'বিচ্ছিন্ন' দেখাতে পারেন তবে দুর্দান্ত it কমপক্ষে আমার মেশিনে আপনি যখনই এটি শুরু করবেন ততবার এটি খুলতে হবে। এখানে আমি ক্লাসটি কীভাবে শেষ করেছি: পেস্টবিন.
com

দুর্দান্ত লাগছে! আমি বিশেষত আপনার যে সীমানাগুলি যেখানে আপনি একটি
চৌম্বকটি

@ ফ্লোয়ার আপনি উইন্ডোটি এখনই খুললে ধসে পড়বে না।
TheNumberOne
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.