স্কালায় একটি ব্রেনহ্যাম সার্কেল (35)
ব্রেনহ্যাম - অ্যালগরিদমের দুটি প্রধান পয়েন্ট রয়েছে:
- পাপ / কোসিন ছাড়া কাজ করে।
- আপনি কেবল ¼ * ½ বৃত্ত গণনা করুন, অন্যান্য পয়েন্টগুলি মিরর দিয়ে খুঁজে পাওয়া যায় by
এটা কিভাবে করতে হবে:
2 1
DCBABCD
জিএফই | EFG
আইজে ওয়াই | ---- জে
জিজে | / JG
এফ | / | এফ
ডিই | আর / | ইডি
সি | / | সি
বি 4 | / | খ 3
এ + ------- এ
বি 4 'এক্স বি 3'
সিসি
ডিই ইডি
মুক্তিযোদ্ধা
জিজে জেজি
আইজে জে
জিএফই ইএফজি
DCBABCD
2'1 '
- আমরা কেবল জেনিট থেকে আইতে সংখ্যাগুলি গণনা করি।
- পয়েন্ট I 45 ° এ, x == y দ্বারা সংজ্ঞায়িত।
- স্থল শূন্য যেখানে + আছে।
- জেনিটের A হ'ল বিন্দু (x = 0, y = r), r = ব্যাসার্ধ।
- একটি বদ্ধ চেনাশোনা আঁকতে আমরা ঘড়ির কাঁটা (++ x), যা ডানদিকে (x + = 1) অথবা পরবর্তী পয়েন্টে নীচে চলেছি, (y- = 1)।
- বৃত্তের প্রতিটি বিন্দু (x, y) কেন্দ্র থেকে দূরে থাকে। পাইথাগোরাস বলেছেন, r² = x² + y² ²
- এটি 2 টি সমাধানের সাথে বর্গমূলের সমীকরণ এবং সমীকরণের মতো গন্ধযুক্ত তবে সাবধান!
- আমরা এ থেকে শুরু করি এবং জানতে চাই, আমরা নীচের পয়েন্টের পাশে বা ডানদিকে নীচের বিন্দুটি রঙ করি কিনা।
- আমরা উভয় পয়েন্টের জন্য গণনা করি (x² + y²) এবং r² এর উভয় পার্থক্য তৈরি করি (যা অবশ্যই স্থির থাকে)।
- যেহেতু পার্থক্যটি নেতিবাচক হতে পারে, তাই আমরা এগুলি থেকে অ্যাবস গ্রহণ করি।
- তারপরে আমরা দেখতে পাই কোন পয়েন্টটি ফলাফলের (r²) কাছাকাছি, ইও ipso আরও ছোট।
- তার উপর নির্ভর করে আমরা ডান বা নীচের প্রতিবেশী আঁকছি।
- সুতরাং পাওয়া পয়েন্ট
- 1 x, y আয়না হয়ে যায়
- 2 -x, y বামে
- 3 টি y, x তিরঙ্গে
- 4 -y, এক্স সেখান থেকে বাম দিকে
- এই সমস্ত পয়েন্টগুলি দক্ষিণে আবার মিরর করা হয়েছে
- 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
আমি এটি সহজ রাখতে ইন্টের জন্য অনুপাতের প্যারামিটারকে সীমাবদ্ধ করেছি, তবে এটি সহজেই ফ্লোটগুলি অনুমোদনের জন্য প্রশস্ত করা যেতে পারে।