როგორ დავხატოთ წრეწირი ფიფქებით ფუნქციის მეშვეობით?

როგორ დავხატოთ წრეწირი ფიფქებით ფუნქციის მეშვეობით?   // ავტორი: m3sk4lit0

// ConsoleApplication2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

void draw_circle(int);

int _tmain(int argc, _TCHAR* argv[])
{
	RPT:
	int radius;
	cout << "Radius (max 19) = ";
	cin >> radius;
	if (radius<20 && radius >0)
		draw_circle(radius);	
	goto RPT;
	_getch();
}

void draw_circle(int radius)
{
	double r = radius;

	for (double y = r; y >= -r; --y)
	{
		for (double x = -r; x <= r; x += 0.5)
		{
			double value = x * x + y * y;
			if (value <= r * r)
			{
				cout << '*';
			}
			else
			{
				cout << ' ';
			}
		}
		cout << endl;
	}
} 

67e99be9a50f.jpg

 

როგორ მუშობს?

მოდი ჩვენთვის სასურველი რადიუსის მქონე წრის დასახატად გამოვიყენოთ დეკარტის კოორდინატთა სისტემა და პითაგორას თეორემა. წარმოვიდგინოთ, რომ ჩვენი კონსოლის ფანჯარაში გვაქვს დეკარტის კოორდინატთა სისტემა და ჩავთვალოთ, რომ ჩვენი წრის ცენტრი შეესაბამება კოორდინატთა სათავეს.

d92ac19ebf09.jpg

მაშინ მისგან r რადიუსით დაშრებული წერტილების ერთობლიობა შემოწერს წირს, რომელიც ჩვენს წრეს შემოხაზავს. ყველა ამ წერტილს შეესაბამება რააც [ x , y ] კოორდინატი(x არის წერტილის დაშორება ორდინატთა ღეეძიდან , y არის წერტილის დაშორება აბცისათა ღეეძიდან). პითაგორას თერემით x*x + y*y = r*r. ჩვენთვის უცნობია ასეთი x და y_ის მნიშვნელობები, მაგრამ ვიცით მათი საზღვრები (მათი მნიშვნელობა არის -5 და 5 ჩაკეტილ შუალედში თუ რადიუსი არის 5_ის ტოლი, ანუ -r და r შუალედში). თუ ჩვენ ციკლების საშალებით რაღაც ბიჯით ვცვლით x და y მნიშვნელობებს და ჩავსვამთ ზემოთ მოყვანილ პითაგორას ფორმულაში, გავიგებთ მოცემული წერტილი ჩვენი წრის შიგნით არის თუ გარეთ.თუ x*x + y*y < r*r, ნიშნავს რომ წერტილი წრეს ეკუთვნის და ფანჯარაში დავწერთ ” * “, წინდააღმდეგ შემთხვევაში ”  “ ანუ სიცარიელეს და კურსორი მარჯვნივ გადახტება.

circle02.jpg

for (double y = r; y >= -r; --y) 

ეს ციკლი ცვლის კონსოლის ფანჯარაში სტრიქონებს ზემოდან ქვემოთ

for (double x = -r; x <= r; x += 0.5)
		{
			double value = x * x + y * y;
			if (value <= r * r)
			{
				cout << '*';
			}
			else
			{
				cout << ' ';
			}
		}

ეს ციკლი კი პირველი ციკლის მიერ არჩეული სტრიქონის მარცხენა კიდიდან მოყვება, კურსორის სხვადასხვა მდებარეობას შეუსაბამებს კოორდინატს, რომელიც არის [x, y] მნიშვნელობის ტოლი, შემდეგ მნიშვნელობებს სვამს ფორმულაში და თუ პირობა ჭეშმარიტია ბეჭდავს *_ს. ციკლიდან გამოსვლის შემდეგ გადავდივართ ახალ სტრიქონზე.

 

goto RPT,value,getch რას ნიშნავს?

RPT დავარქვი ადგილს, საიდანაც კოდის შესრულება იწყება და კოდის დამტავრებისას goto RPT ბრძანებით ისევ თავიდან ვიწყებ კოდის შესრულებას პროგრამის ხელახლა გაშვების გარეშე, _getch() ბრძანება აუცილებელია კოდის შესრულების შემდეგ პროგრამა რომ არ დაიხუროს, ანუ ეკრანი დააყოვნოს.

 

value დავარქვის ცვლადს, რომლის მნიშვნელობაც x და y მნიშვნელობების კვადრატების ჯამის ტოლია.

 

ბიჯი 0,5 რატომ დავწერეთ?

სტრიქონები ერთმანეთისგან დაშორებულები არიან რაღაც მანძილით, ხოლო სტრიქონში სიმბოლოები თითქმის ეხებიან ერთმანეთს. სტრიქონებს შორის მანძილში თითქმის ეტევა ერთი სიმბოლო, ანუ ორ სტრიქონს შორის სიგრძიშე ჩატეული სიმბოლოების რაოდენობა 2-ჯერ ნაკლებია იგივე სიგრძის სტრიქონში ჩატეული სიმბოლოების რაოდენობისა. პირველ ციკლში –y ნიშნავს -1 ბიჯს, 2ჯერ ნაკლები ავიღეთ მეორე ციკლში, ანუ 0,5
e57a456d6e26.jpg