स्काला में एक ब्रेसेनहैम सर्कल (35)
ब्रेसेनहैम - एल्गोरिथ्म के 2 प्रमुख बिंदु हैं:
- पाप / कोसिन के बिना काम करता है।
- आप केवल only *, सर्कल की गणना करते हैं, अन्य बिंदु दर्पण द्वारा पाए जाते हैं।
यह कैसे करना है:
२ १
DCBABCD
GFE | EFG
IJ y | ---- जीआई
जीजे | / जेजी
एफ | / | एफ
DE | आर / | ईडी
सी | / | सी
B 4 | / | बी ३
ए + ------- ए
B 4 'x B 3'
सीसी
DE ED
एफएफ
जीजे जेजी
आईजे जेआई
GFE EFG
DCBABCD
2'1 '
- हम केवल ज़ेनिट से I में ए से संख्या की गणना करते हैं।
- बिंदु I 45 ° पर है, जिसे x == y द्वारा परिभाषित किया गया है।
- ग्राउंड शून्य वह जगह है जहां + है।
- ज़ीनिट में ए बिंदु (x = 0, y = r), आर = त्रिज्या है।
- एक बंद सर्कल को खींचने के लिए हम दक्षिणावर्त (++ x) को स्थानांतरित करते हैं, जो दाईं ओर (x + = 1) या अगले बिंदु पर नीचे है, (y- = 1)।
- सर्कल पर हर बिंदु (x, y) केंद्र से दूर है। पाइथागोरस कहते हैं, r² = xha + y says।
- यह 2 समाधानों के साथ वर्गमूल और समीकरणों की तरह खुशबू आ रही है, लेकिन सावधान!
- हम ए पर शुरू करते हैं और जानना चाहते हैं, कि क्या हम नीचे बिंदु के बगल में पेंट करते हैं या दाईं ओर नीचे बिंदु।
- हम दोनों बिंदुओं (x² + y²) के लिए गणना करते हैं और दोनों r which (जो निश्चित रूप से स्थिर रहता है) के अंतर के लिए निर्माण करते हैं।
- चूंकि अंतर नकारात्मक हो सकता है, इसलिए हम इसे से एब्स लेते हैं।
- फिर हम देखते हैं कि कौन सा बिंदु परिणाम (r,) के करीब है, eo ipso छोटा।
- इसके आधार पर हम सही या निचले पड़ोसी को आकर्षित करते हैं।
- इतना पाया बिंदु
- 1 एक्स, वाई मिरर हो जाता है
- 2 -x, y बाईं ओर
- विकर्ण पर 3 y, x
- 4 -y, x वहाँ से बाईं ओर
- उन सभी बिंदुओं को फिर से दक्षिण में प्रतिबिंबित किया जाता है
- 1 'x, -y
- 2 '-x, -y
- 3 'y, -x
- 4 '-y, -x किया।
यह कोड गोल्फ नहीं है, लेकिन मौजूदा समाधानों के शीर्ष पर उन सभी नंबरों ने मुझे लगता है कि यह ऐसा है, इसलिए मैंने अपना समाधान गोल्फ में बेकार समय बिताया। इसलिए मैंने शीर्ष पर एक बेकार संख्या भी जोड़ दी। यह 11 बार पाई गोल है।
object BresenhamCircle extends App {
var count = 0
val r = args(0).toInt
// ratio > 1 means expansion in horizontal direction
val ratio = args(1).toInt
val field = ((0 to 2 * r).map (i=> (0 to 2 * r * ratio).map (j=> ' ').toArray)).toArray
def square (x: Int, y: Int): Int = x * x + y * y
def setPoint (x: Int, y: Int) {
field (x)(y*ratio) = "Bresenham"(count)
field (y)(x*ratio) = "Bresenham"(count)
}
def points (x: Int, y: Int)
{
setPoint (r + x, r + y)
setPoint (r - x, r + y)
setPoint (r + x, r - y)
setPoint (r - x, r - y)
}
def bresenwalk () {
var x = 0;
var y = r;
val rxr = r * r
points (x, y);
do
{
val (dx, dy) = { if (math.abs (rxr - square ((x+1), y)) < math.abs (rxr - square (x, (y-1))))
(1, 0)
else
(0, -1)
}
count = (count + 1) % "Bresenham".length
x += dx
y += dy
points (x, y)
}while ((x <= y))
}
bresenwalk ()
println (field.map (_.mkString ("")).mkString ("\n"))
}
फ़ॉन्ट-प्रश्न साइट वेबसर्वर और आपकी ब्राउज़र सेटिंग्स द्वारा तय किया जाता है। अब, मैं देख रहा हूँ कि यह है
'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif
फ़ॉन्ट-आकार 12px है। बहुत बेकार की जानकारी, अगर आप मुझसे पूछें, लेकिन कौन करता है?
बोनस: दीर्घवृत्त और नमूना आउटपुट:
मंगलाचरण है
scala BresenhamCircle SIZE RATIO
उदाहरण के लिए
scala BresenhamCircle 10 2
s e r B r e s
h n e e n h
e m a a m e
e r r e
m m
h a a h
n n
s e e s
e e
r r
B B
r r
e e
s e e s
n n
h a a h
m m
e r r e
e m a a m e
h n e e n h
s e r B r e s
A ratio of 2 will print a circular shape for most fonts which happen to be about twice as tall than wide. To compensate for that, we widen by 2.
# As smaller value than 2 only 1 is available:
scala BresenhamCircle 6 1
erBre
aes sea
ah ha
e e
es se
r r
B B
r r
es se
e e
ah ha
aes sea
erBre
# widening it has more freedom:
scala BresenhamCircle 12 5
s e r B r e s
a h n e e n h a
B m m B
e r r e
e s s e
B r r B
a m m a
h h
n n
s e e s
e e
r r
B B
r r
e e
s e e s
n n
h h
a m m a
B r r B
e s s e
e r r e
B m m B
a h n e e n h a
s e r B r e s
मैंने Int को सरल रखने के लिए अनुपात पैरामीटर को प्रतिबंधित किया, लेकिन इसे आसानी से फ़्लोट करने की अनुमति देने के लिए चौड़ा किया जा सकता है।