मैं सी # के साथ एक द्वीप के नक्शे के लिए एक मुखौटा बनाने के लिए एक अच्छा और आसान तरीका खोज रहा हूं।
मूल रूप से मैं एक यादृच्छिक ऊंचाई के साथ उपयोग कर रहा हूँ जो कि पेरेलिन के शोर से उत्पन्न होती है, जहाँ इलाके पानी से नहीं घिरे होते हैं।
अगला कदम एक मुखौटा उत्पन्न करना होगा, यह सुनिश्चित करने के लिए कि कोनों और सीमाएं सिर्फ पानी हैं।
तब मैं सिर्फ एक द्वीप पाने के लिए पर्किन शोर छवि से मुखौटा घटा सकता हूं।
और इसके विपरीत के साथ खेल रहा है ..
और ढाल वक्र, मैं एक द्वीप ऊंचाई प्राप्त कर सकता हूं जैसे मैं चाहता हूं।
(ये सिर्फ उदाहरण हैं)
जैसा कि आप देख सकते हैं, द्वीप के "किनारों" को बस काट दिया जाता है, जो कि रंग का मूल्य बहुत अधिक सफेद न होने के कारण एक बड़ी समस्या नहीं है, क्योंकि मैं ग्रेस्केल को 4 परतों (पानी, रेत, घास और) में विभाजित करूंगा चट्टान)।
मेरा सवाल यह है कि मैं दूसरी छवि में एक अच्छा दिखने वाला मुखौटा कैसे बना सकता हूं?
अद्यतन करें
मैंने इस तकनीक को पाया है, यह मेरे लिए एक अच्छा शुरुआती बिंदु प्रतीत होता है, लेकिन मुझे यकीन नहीं है कि वांछित आउटपुट प्राप्त करने के लिए मैं इसे कैसे लागू कर सकता हूं। http://mrl.nyu.edu/~perlin/experiments/puff/
अद्यतन २
यह मेरा अंतिम समाधान है।
मैंने makeMask()
अपने सामान्यीकरण लूप के अंदर फ़ंक्शन को इस तरह लागू किया है :
//normalisation
for( int i = 0; i < width; i++ ) {
for( int j = 0; j < height; j++ ) {
perlinNoise[ i ][ j ] /= totalAmplitude;
perlinNoise[ i ][ j ] = makeMask( width, height, i, j, perlinNoise[ i ][ j ] );
}
}
और यह अंतिम कार्य है:
public static float makeMask( int width, int height, int posX, int posY, float oldValue ) {
int minVal = ( ( ( height + width ) / 2 ) / 100 * 2 );
int maxVal = ( ( ( height + width ) / 2 ) / 100 * 10 );
if( getDistanceToEdge( posX, posY, width, height ) <= minVal ) {
return 0;
} else if( getDistanceToEdge( posX, posY, width, height ) >= maxVal ) {
return oldValue;
} else {
float factor = getFactor( getDistanceToEdge( posX, posY, width, height ), minVal, maxVal );
return oldValue * factor;
}
}
private static float getFactor( int val, int min, int max ) {
int full = max - min;
int part = val - min;
float factor = (float)part / (float)full;
return factor;
}
public static int getDistanceToEdge( int x, int y, int width, int height ) {
int[] distances = new int[]{ y, x, ( width - x ), ( height - y ) };
int min = distances[ 0 ];
foreach( var val in distances ) {
if( val < min ) {
min = val;
}
}
return min;
}
यह इमेज # 3 में आउटपुट देगा।
कोड में थोड़े बदलाव के साथ, आप छवि # 2 -> में मूल रूप से वांछित आउटपुट प्राप्त कर सकते हैं
public static float makeMask( int width, int height, int posX, int posY, float oldValue ) {
int minVal = ( ( ( height + width ) / 2 ) / 100 * 2 );
int maxVal = ( ( ( height + width ) / 2 ) / 100 * 20 );
if( getDistanceToEdge( posX, posY, width, height ) <= minVal ) {
return 0;
} else if( getDistanceToEdge( posX, posY, width, height ) >= maxVal ) {
return 1;
} else {
float factor = getFactor( getDistanceToEdge( posX, posY, width, height ), minVal, maxVal );
return ( oldValue + oldValue ) * factor;
}
}