From b2ea9383870a4dab484fb12fad93cf208958c819 Mon Sep 17 00:00:00 2001 From: bmana21 Date: Mon, 31 Oct 2022 19:58:37 +0400 Subject: [PATCH 1/4] Implemented solution and explanation --- problem-set/RandomCircles.java | 45 ++++++++++++++++++++++++++++ problem-set/RandomCircles.md | 55 ++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 problem-set/RandomCircles.java create mode 100644 problem-set/RandomCircles.md diff --git a/problem-set/RandomCircles.java b/problem-set/RandomCircles.java new file mode 100644 index 0000000..c388fbc --- /dev/null +++ b/problem-set/RandomCircles.java @@ -0,0 +1,45 @@ +/* + * File: RandomCircles.java + * ---------------------------- + * კანვასზე დახატეთ 1000 შემთხვევითი რადიუსის მქონე შემთხვევითი ფერით გაფერადებული + * წრე, შემთხვევით კოორდინატებზე. + * + * დეტალური ამოხსნა იხილეთ RandomCircles.md ფაილში. + */ + +import java.awt.Color; + +import acm.graphics.GOval; +import acm.graphics.GPoint; +import acm.program.*; +import acm.util.RandomGenerator; + +public class GraphicsProgramSample extends GraphicsProgram { + + public void run() { + for (int i = 0; i < 1000; i++) { + drawRandomCircle(); + } + } + + // Draws random circle on the screen. + private void drawRandomCircle() { + RandomGenerator rand = new RandomGenerator(); + GPoint location = new GPoint(rand.nextInt(0, getWidth()), rand.nextInt(0, getHeight())); // Generating random X and Y on the screen + Color color = rand.nextColor(); + int radius = rand.nextInt(10, 100); // The smallest circle will have radius 10, The largest one - 100 + GOval circle = getCircle(location, color, radius); + add(circle); + } + + // Creates and returns circle with the given parameters. + private GOval getCircle(GPoint location, Color color, int radius) { + GOval circle = new GOval(radius * 2, radius * 2); // We should multiply radius by 2 to get the diameter + circle.setFilled(true); + circle.setFillColor(color); + circle.setLocation(location.getX() - radius, location.getY() - radius); // location is the center of the circle. + return circle; + } + +} + diff --git a/problem-set/RandomCircles.md b/problem-set/RandomCircles.md new file mode 100644 index 0000000..ad364d6 --- /dev/null +++ b/problem-set/RandomCircles.md @@ -0,0 +1,55 @@ +# RandomCircles + +## პრობლემა: + +კანვასზე დახატეთ **1000** შემთხვევითი რადიუსის მქონე შემთხვევითი ფერით გაფერადებული წრე, შემთხვევით კოორდინატებზე. + +## პრობლემის გადაჭრის გზა: + +პირველ რიგში უნდა ავარჩიოთ წრისთვის **X** და **Y** კოორდინატები **RandomGenerator**-ით, რომელსაც **nextInt()** მეთოდი აქვს, შემდეგ ავირჩევთ ჩვენი წრისთვის შემთხვევით ფერს **RandomGenerator**-ის **nextColor()** ფუნქციით, ბოლოს კი წრის რადიუსს ავირჩევთ შემთხვევითად, გავაკეთებთ არჩეული პარამეტრებით ახალ წრეს და დავამატებთ ეკრანზე. მოცემული პროცედურა **1000**-ჯერ უნდა გავიმეოროთ. + +## პრობლემის გადაჭრის გზის კოდად გარდაქმნა: + +1. გავაკეთოთ **drawRandomCircle()** მეთოდი, რომლის ერთხელ გამოძახებითაც ეკრანზე შემთხვევით კოორდინატზე შემთხვევითი ფერით გაფერადებული შემთხვევითი რადიუსის მქონე წრე დაიხატება. ამოცანის გადასაჭრელად მოცემული მეთოდის **1000**-ჯერ გამოძახება მოგვიწევს: +```java + for (int i = 0; i < 1000; i++) { + drawRandomCircle(); + } +``` + +2. **drawRandomCircle()** მეთოდში პირველ რიგში უნდა შევქმნათ **RandomGenerator**-ის ობიექტი, რომელსაც ჩვენი წრისთვის შემთხვევითი პარამეტრების ასარჩევად გამოვიყენებთ: +```java + RandomGenerator rand = new RandomGenerator(); +``` + +3. შემთხვევითი ლოკაცია რომ ავირჩიოთ ეკრანზე, ამისათვის შემთხვევითი **X** და **Y** კოორდინატები უნდა ავიღოთ ეკრანიდან. **RandomGenerator**-ს აქვს **nextInt(L, R)** მეთოდი, რომელიც აბრუნებს შემთხვევითად არჩეულ მთელ რიცხვს **L**-დან **R**-მდე. **X** კოორდინატი უნდა ავირჩიოთ **0**-დან **getWidth()**-მდე, ხოლო **Y** **0**-დან **getHeight()**-მდე: +```java + GPoint location = new GPoint(rand.nextInt(0, getWidth()), rand.nextInt(0, getHeight())); +``` + +4. შემთხვევითი ფერის არჩევა უფრო მარტივია, რადგან **RandomGenerator**-ს აქვს **nextColor()** მეთოდი, რომელიც **Color** ტიპის ობიექტს აბრუნებს. + +5. რადიუსსაც **nextInt(L, R)**-ის საშუალებით ავირჩევთ, დავუშვად ჩვენი წრე გვინდა იყოს შემთხვევითად არჩეული რადიუსის **10**-დან **1000**-მდე, მაშინ მივიღებთ კოდს: +```java + int radius = rand.nextInt(10, 100); +``` + +6. მოცემული პარამეტრებით უნდა გავაკეთოთ წრე: +```java + GOval circle = new GOval(radius * 2, radius * 2); + circle.setFilled(true); + circle.setFillColor(color); + circle.setLocation(location.getX() - radius, location.getY() - radius); +``` +წრის ეკრანზე ლოკაციად არა პირდაპირ **location**, არამედ **(location.getX() - radius, location.getY() - radius)** ავირჩიეთ, რადგან **GOval**-ის ლოკაცია წრის ზედა მარცხენა კუთხეზე მიუთითებს და არა მის ცენტრზე, ჩვენ კი გვნიდოდა, რომ შემთხვევითად წრის ცენტრის კოორდინატები აგვერჩია. + +7. ბოლოს ეკრანზე უნდა დავამატოთ ჩვენ მიერ შექმნილი წრე: +```java + add(circle); +``` + +## შესაძლო ხარვეზები: + +1. **setFilled(true)** თუ დაგავიწყდებათ, მაშინ წრე არ გაფერადდება და ეკრანზე წრეწირები დაიხატება. + +2. როდესაც ახალ წრეს ვაკეთებთ, თუ მის ზომას **GOval**-ს გადავცემთ როგორც **(radius, radius)**, მაშინ მივიღებთ წრეს, რომლის დიამეტრი **radius**-ის ტოლი იქნება, ამიტომ რადიუსი ორზე უნდა გავამრავლოთ და ისე გადავცეთ. From 476adad5fddab198ea4fe1bad8074e3c86f78251 Mon Sep 17 00:00:00 2001 From: bmana21 Date: Wed, 16 Nov 2022 06:58:03 +0400 Subject: [PATCH 2/4] commit #1 --- problem-set/RandomCircles.java | 45 ---------------------------- problem-set/RandomCircles.md | 55 ---------------------------------- 2 files changed, 100 deletions(-) delete mode 100644 problem-set/RandomCircles.java delete mode 100644 problem-set/RandomCircles.md diff --git a/problem-set/RandomCircles.java b/problem-set/RandomCircles.java deleted file mode 100644 index c388fbc..0000000 --- a/problem-set/RandomCircles.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * File: RandomCircles.java - * ---------------------------- - * კანვასზე დახატეთ 1000 შემთხვევითი რადიუსის მქონე შემთხვევითი ფერით გაფერადებული - * წრე, შემთხვევით კოორდინატებზე. - * - * დეტალური ამოხსნა იხილეთ RandomCircles.md ფაილში. - */ - -import java.awt.Color; - -import acm.graphics.GOval; -import acm.graphics.GPoint; -import acm.program.*; -import acm.util.RandomGenerator; - -public class GraphicsProgramSample extends GraphicsProgram { - - public void run() { - for (int i = 0; i < 1000; i++) { - drawRandomCircle(); - } - } - - // Draws random circle on the screen. - private void drawRandomCircle() { - RandomGenerator rand = new RandomGenerator(); - GPoint location = new GPoint(rand.nextInt(0, getWidth()), rand.nextInt(0, getHeight())); // Generating random X and Y on the screen - Color color = rand.nextColor(); - int radius = rand.nextInt(10, 100); // The smallest circle will have radius 10, The largest one - 100 - GOval circle = getCircle(location, color, radius); - add(circle); - } - - // Creates and returns circle with the given parameters. - private GOval getCircle(GPoint location, Color color, int radius) { - GOval circle = new GOval(radius * 2, radius * 2); // We should multiply radius by 2 to get the diameter - circle.setFilled(true); - circle.setFillColor(color); - circle.setLocation(location.getX() - radius, location.getY() - radius); // location is the center of the circle. - return circle; - } - -} - diff --git a/problem-set/RandomCircles.md b/problem-set/RandomCircles.md deleted file mode 100644 index ad364d6..0000000 --- a/problem-set/RandomCircles.md +++ /dev/null @@ -1,55 +0,0 @@ -# RandomCircles - -## პრობლემა: - -კანვასზე დახატეთ **1000** შემთხვევითი რადიუსის მქონე შემთხვევითი ფერით გაფერადებული წრე, შემთხვევით კოორდინატებზე. - -## პრობლემის გადაჭრის გზა: - -პირველ რიგში უნდა ავარჩიოთ წრისთვის **X** და **Y** კოორდინატები **RandomGenerator**-ით, რომელსაც **nextInt()** მეთოდი აქვს, შემდეგ ავირჩევთ ჩვენი წრისთვის შემთხვევით ფერს **RandomGenerator**-ის **nextColor()** ფუნქციით, ბოლოს კი წრის რადიუსს ავირჩევთ შემთხვევითად, გავაკეთებთ არჩეული პარამეტრებით ახალ წრეს და დავამატებთ ეკრანზე. მოცემული პროცედურა **1000**-ჯერ უნდა გავიმეოროთ. - -## პრობლემის გადაჭრის გზის კოდად გარდაქმნა: - -1. გავაკეთოთ **drawRandomCircle()** მეთოდი, რომლის ერთხელ გამოძახებითაც ეკრანზე შემთხვევით კოორდინატზე შემთხვევითი ფერით გაფერადებული შემთხვევითი რადიუსის მქონე წრე დაიხატება. ამოცანის გადასაჭრელად მოცემული მეთოდის **1000**-ჯერ გამოძახება მოგვიწევს: -```java - for (int i = 0; i < 1000; i++) { - drawRandomCircle(); - } -``` - -2. **drawRandomCircle()** მეთოდში პირველ რიგში უნდა შევქმნათ **RandomGenerator**-ის ობიექტი, რომელსაც ჩვენი წრისთვის შემთხვევითი პარამეტრების ასარჩევად გამოვიყენებთ: -```java - RandomGenerator rand = new RandomGenerator(); -``` - -3. შემთხვევითი ლოკაცია რომ ავირჩიოთ ეკრანზე, ამისათვის შემთხვევითი **X** და **Y** კოორდინატები უნდა ავიღოთ ეკრანიდან. **RandomGenerator**-ს აქვს **nextInt(L, R)** მეთოდი, რომელიც აბრუნებს შემთხვევითად არჩეულ მთელ რიცხვს **L**-დან **R**-მდე. **X** კოორდინატი უნდა ავირჩიოთ **0**-დან **getWidth()**-მდე, ხოლო **Y** **0**-დან **getHeight()**-მდე: -```java - GPoint location = new GPoint(rand.nextInt(0, getWidth()), rand.nextInt(0, getHeight())); -``` - -4. შემთხვევითი ფერის არჩევა უფრო მარტივია, რადგან **RandomGenerator**-ს აქვს **nextColor()** მეთოდი, რომელიც **Color** ტიპის ობიექტს აბრუნებს. - -5. რადიუსსაც **nextInt(L, R)**-ის საშუალებით ავირჩევთ, დავუშვად ჩვენი წრე გვინდა იყოს შემთხვევითად არჩეული რადიუსის **10**-დან **1000**-მდე, მაშინ მივიღებთ კოდს: -```java - int radius = rand.nextInt(10, 100); -``` - -6. მოცემული პარამეტრებით უნდა გავაკეთოთ წრე: -```java - GOval circle = new GOval(radius * 2, radius * 2); - circle.setFilled(true); - circle.setFillColor(color); - circle.setLocation(location.getX() - radius, location.getY() - radius); -``` -წრის ეკრანზე ლოკაციად არა პირდაპირ **location**, არამედ **(location.getX() - radius, location.getY() - radius)** ავირჩიეთ, რადგან **GOval**-ის ლოკაცია წრის ზედა მარცხენა კუთხეზე მიუთითებს და არა მის ცენტრზე, ჩვენ კი გვნიდოდა, რომ შემთხვევითად წრის ცენტრის კოორდინატები აგვერჩია. - -7. ბოლოს ეკრანზე უნდა დავამატოთ ჩვენ მიერ შექმნილი წრე: -```java - add(circle); -``` - -## შესაძლო ხარვეზები: - -1. **setFilled(true)** თუ დაგავიწყდებათ, მაშინ წრე არ გაფერადდება და ეკრანზე წრეწირები დაიხატება. - -2. როდესაც ახალ წრეს ვაკეთებთ, თუ მის ზომას **GOval**-ს გადავცემთ როგორც **(radius, radius)**, მაშინ მივიღებთ წრეს, რომლის დიამეტრი **radius**-ის ტოლი იქნება, ამიტომ რადიუსი ორზე უნდა გავამრავლოთ და ისე გადავცეთ. From 625ee0511b91e4fa124f55ad37d701acc789da3b Mon Sep 17 00:00:00 2001 From: bmana21 Date: Wed, 16 Nov 2022 17:07:53 +0400 Subject: [PATCH 3/4] Implemented solution and explanation --- problem-set/ResizableGrid.java | 52 ++++++++++++++++++++++++++++++++ problem-set/ResizableGrid.md | 54 ++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 problem-set/ResizableGrid.java create mode 100644 problem-set/ResizableGrid.md diff --git a/problem-set/ResizableGrid.java b/problem-set/ResizableGrid.java new file mode 100644 index 0000000..157f41f --- /dev/null +++ b/problem-set/ResizableGrid.java @@ -0,0 +1,52 @@ +/* + * File: ResizableGrid.java + * ---------------------------- + * მთელ ფორმაზე ბადის დახატვა, ისე რომ ფორმის ზომის ცვლილებაზე ბადის უჯრის ზომაც + * პროპორციულად იზრდებოდეს. + */ + +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; + +import acm.graphics.GRect; +import acm.program.GraphicsProgram; + +public class GraphicsProgramSample extends GraphicsProgram implements ComponentListener { + + // Size of the board + private final int BOARD_WIDTH = 10; + private final int BOARD_HEIGHT = 10; + + public void run() { + addComponentListener(this); + } + + public void componentResized(ComponentEvent e) { + drawBoard(getWidth(), getHeight()); + } + + // This method draw board with (width, height) size + private void drawBoard(int width, int height) { + removeAll(); + int cellWidth = width / BOARD_WIDTH; // Width of each cell + int cellHeight = height / BOARD_HEIGHT; // Height of each cell + for (int k = 0; k < BOARD_WIDTH; k++) { + for (int i = 0; i < BOARD_HEIGHT; i++) { + // Coordinates of the (k,i) cell will be (k * cellWidth, i * cellHeight) + GRect cell = new GRect(k * cellWidth, i * cellHeight, cellWidth, cellHeight); + add(cell); + } + } + } + + public void componentHidden(ComponentEvent e) { + } + + public void componentMoved(ComponentEvent e) { + } + + public void componentShown(ComponentEvent e) { + } + +} + diff --git a/problem-set/ResizableGrid.md b/problem-set/ResizableGrid.md new file mode 100644 index 0000000..9457575 --- /dev/null +++ b/problem-set/ResizableGrid.md @@ -0,0 +1,54 @@ +# ResizableGrid + +## პრობლემა: + +მთელ ფორმაზე ბადის დახატვა, ისე რომ ფორმის ზომის ცვლილებაზე ბადის უჯრის ზომაც +პროპორციულად იზრდებოდეს. + +## პრობლემის გადაჭრის გზა: + +გავაკეთოთ **drawBoard(int width, int height)** მეთოდი, რომელსაც **width** და **height** გადაეცემა და **(0,0)** წერტილიდან ამ სიგრძისა და სიგანის ბადეს დახატავს. შემდეგ ჩვენს კანვასზე დავამატოთ **ComponentListener**-ები და როდესაც ფანჯრის ზომა შეიცვლება, **drawBoard()**-ს გამოვიძახებთ და მას გადავცემთ ფანჯრის ახალ **getWidth()**-ს და **getHeight()**-ს. + +## პრობლემის გადაჭრის გზის კოდად გარდაქმნა: + +1. თავდაპირველად შევქმანთ ორი **final int** ტიპის ცვლადი **BOARD_WIDTH** და **BOARD_HEIGHT**, რომელშიც ბადის სიგანესა და სიგრძეში უჯრების რაოდენობა გვეწერება. თუ ბადის ზომის შეცვლა დაგვჭირდება, მარტივად მხოლოდ **BOARD_WIDTH**-ს და **BOARD_HEIGHT**-ს შევცვლით. + +2. გავაკეთოთ **drawBoard(int width, int height)** მეთოდი, რომელშიც **width** და **height** ზომის ბადეს დავხატავთ. პირველ რიგში გავიგოთ ბადეში თითოეული უჯრის განზომილებები, **cellWidth** და **cellHeight**. უჯრის სიგანე იქნება **width / BOARD_WIDTH** და სიმაღლე **height / BOARD_HEIGHT**. + +3. ბადის დასახატად თითოეული უჯრა დავხატოთ როგორც **GRect**. სულ მოგვიწევს **BOARD_WIDTH** რაოდენობის უჯრის დახატვა თითოეულ სტრიქონში, სტრიქონების რაოდენობა იქნება **BOARD_HEIGHT**. ყველა უჯრის დასახატად დაგვჭირდება ორი for ციკლი შემდეგნაირად: +```java + for (int k = 0; k < BOARD_WIDTH; k++) { + for (int i = 0; i < BOARD_HEIGHT; i++) { + + } + } +``` + +4. გავაკეთოთ **GRect** ცვლადი. მისი ზომები უკვე გამოვთვალეთ **(cellWidth, cellHeight)**, კოორდინატები კი იქნება **(k * cellWidth, i * cellHeight)**. დავამატოთ **GRect** ეკრანზე **add()** მეთოდით. + +5. მთავარი ნაწილი ამოცანაში ბადის ზომის შეცვლაა ფანჯრის ზომის ცვლილებასთან ერთად. ამისათვის, პირველ რიგში ჩვენმა კლასმა უნდა დააიმპლემენტიროს **ComponentListener** ინტერფეისი და ჩვენს კანვასზე დავამატოთ **componentListener**, რასაც **addComponentListener(this)**-ის საშუალებით გავაკეთებთ. რადგან ჩვენმა კლასმა **ComponentListener** ინტერფეისი დააიმპლემენტირა, უნდა ჩამოვწეროთ **ComponentListener** ინტერფეისში აღწერილი ყველა მეთოდი(მიუხედავად იმისა, გამოვიყენებთ მათ თუ არა): +```java + public void componentResized(ComponentEvent e) { + } + + public void componentHidden(ComponentEvent e) { + } + + public void componentMoved(ComponentEvent e) { + } + + public void componentShown(ComponentEvent e) { + } +``` + +6. როდესაც ფანჯრის ზომა შეიცვლება, **componentResized(ComponentEvent e)** მეთოდი ავტომატურად გამოიძახება, ამიტომ ამ მეთოდში **drawBoard(getWidth(), getHeight())** გამოვიძახოთ, რომ კანვაზე ბადე დავხაზოთ ფანჯრის ახალი ზომების მიხედვით. + +7. **drawBoard()**-ის ყოველი ახალი გამოძახებისას ეკრანზე დახატული ყველა ელემენტი უნდა წავშალოთ **removeAll()** მეთოდით, თორემ ბადეები ერთმანეთს გადაეხატება. + +## შესაძლო ხარვეზები: + +1. თუ **ComponentListener** ინტერფეისის ყველა მეთოდს არ ჩამოვწერთ ჩვენს კლასში, კომპილაციის შეცდომა იქნება და კოდი არ გაეშვება. + +2. **addComponentListener(this)**-ის დაწერა თუ დაგვავიწყდება, ფანჯრის ზომის ცვლილებაზე **listener**-ები არ დაემატება, შესაბამისად არც **componentResized()** მეთოდი გამოიძახება. + +3. როდესაც ორმაგი ციკლი დავწერეთ უჯრების დასახატად, **k**-სა და **i**-ს ინდექსები **0** დან დავიწყეთ, რადგან ამ ორ ცვლადს **(k, i)** უჯრის კოორდინატების დასათვლელად ვიყენებთ. **1**-დან რომ დაგვეწყო **(k * cellWidth, i * cellHeight)**-ის ნაცვლად **((k - 1) * cellWidth, (i - 1) * cellHeight)**-ის დაწერა მოგვიწევდა. From 5dc079e6cf05c1197f475f06c2024887af7eafe3 Mon Sep 17 00:00:00 2001 From: bmana21 Date: Wed, 16 Nov 2022 17:16:03 +0400 Subject: [PATCH 4/4] Implemented solution and explanation --- problem-set/ResizableGrid.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/problem-set/ResizableGrid.java b/problem-set/ResizableGrid.java index 157f41f..1d33c48 100644 --- a/problem-set/ResizableGrid.java +++ b/problem-set/ResizableGrid.java @@ -3,6 +3,8 @@ * ---------------------------- * მთელ ფორმაზე ბადის დახატვა, ისე რომ ფორმის ზომის ცვლილებაზე ბადის უჯრის ზომაც * პროპორციულად იზრდებოდეს. + * + * დეტალური ამოხსნა იხილეთ ResizableGrid.md ფაილში. */ import java.awt.event.ComponentEvent;