diff --git a/problem-set/PaintLine.java b/problem-set/PaintLine.java new file mode 100644 index 0000000..67d5bda --- /dev/null +++ b/problem-set/PaintLine.java @@ -0,0 +1,49 @@ +/* + * File: PaintLine.java + * ---------------------------- + * Paint-ის მონაკვეთის ხატვის გაკეთება, ჯერ აჭერ მაუსს, ფიქსირდება ერთი წვერო, მერე + * მაუსის მოძრაობისას მონაკვეთიც მოძრაობს რადგან მეორე წვერო არაა დაფიქსირებული და + * კლიკით ფიქსირდება მეორე წვეროც. + */ + +import acm.graphics.*; +import acm.program.*; +import java.awt.event.*; + +public class PaintLine extends GraphicsProgram { + + + private boolean startClicked; + private boolean endClicked; + private GLine line; + + //in the start there are no points clicked. + //adding mouse listeners. + public void init() { + startClicked = false; + endClicked = false; + addMouseListeners(); + } + + //if starting point isn't clicked yet and user clicked it now, + //add add line on those coordinates. + //else if end point isn't clicked yet and user clicked it, + //mark its boolean as true. + public void mouseClicked(MouseEvent e) { + if (!startClicked) { + line = new GLine(e.getX(), e.getY(), e.getX(), e.getY()); + add(line); + startClicked = true; + } else if (!endClicked) { + endClicked = true; + } + } + + //if starting point has already set, update line ending point + //to show that line ending point is moving with cursor. + public void mouseMoved(MouseEvent e) { + if (startClicked && !endClicked) + line.setEndPoint(e.getX(), e.getY()); + } + +} diff --git a/problem-set/PaintLine.md b/problem-set/PaintLine.md new file mode 100644 index 0000000..679adf8 --- /dev/null +++ b/problem-set/PaintLine.md @@ -0,0 +1,11 @@ +# PaintLine + +პრობლემა: +``` +Paint-ის მონაკვეთის ხატვის გაკეთება, ჯერ აჭერ მაუსს, ფიქსირდება ერთი წვერო, მერე +მაუსის მოძრაობისას მონაკვეთიც მოძრაობს რადგან მეორე წვერო არაა დაფიქსირებული და +კლიკით ფიქსირდება მეორე წვეროც. +``` + +## პრობლემის გადაჭრის გზა +გავაკეთოთ `boolean` ტიპის ცვლადები, რომლებიც შეინახავენ ინფორმაციას იმის შესახებ, დავაფიქსირეთ თუ არა დასაწყისი და საბოლოო წერტილი, ასევე აღვწეროთ მონაკვეთიც, `GLine` ტიპის ობიექტი. თავდაპირველად, რა თქმა უნდა, ორივე ცვლადის მნიშნველობაა `false`. მაუსზე დაკლიკვის შემთხვევაში, უნდა შევამოწმოთ, რომელი წერტილი დაფიქსირდა. იმ შემთხვევაში თუ საწყისი წერტილისთვის განკუთვნილი ცვლადის `startClicked`-ის მნიშვნელობაა `false`, ნიშნავს, რომ ახლა ხდება საწყისი წერტილის არჩევა. კლიკის შემთხვევაში კანვასზე დავამატოთ აღწერილი მონაკვეთი საწყისი და საბოლოო ერთი და იმავე კოორდინატებით, კლიკის ადგილზე. ახლა უკვე უნდა ავსახოთ მონაკვეთი, რომელიც იმოძრავებს კურსორთან ერთად. ეს ხდება მხოლოდ იმ შემთხვევაში, როცა საწყისი წერტილი დაფიქსირებულია, ხოლო საბოლოო არა, სწორედ ასეთ დროს `mouseMoved` მეთოდში თანდათან ვცვალოთ მონაკვეთის მეორე ბოლოს კოორდინატები. იმ შემთხვევაში თუ კლიკი მოხდა, `startClicked`-ის მნიშვნელობაა `true`, ხოლო `endClicked`-ის მნიშვნელობაა `false`, ნიშნავს, რომ ფიქსირდება საბოლოო წერტილი. შესაბამისად შევცვლით ცვლადის მნიშვნელობას და მონაკვეთი გაჩერდება შესაბამის პოზიციაზე `mouseMoved` მეთოდში დაწერილი კოდის მიხედვით. \ No newline at end of file