BG Development


  Reply to this topicStart new topicStart Poll

> Задача по ООП
chochyy
Публикувано на: 22-04-2023, 17:45
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 22.04.23



Здравейте,
Имам нужда от помощ за класовете на тази задача:
Да се напише програма която позволява интерактивно създаване на сцена, съдържаща произволен брой правоъгълници, определени по 2 диагонални точки и отсечки, определени по начална и крайна точка, задавани с ляв бутон на мишката. Да се реализира операция изтриване на обект (с десен бутон на мишката или комбинация Ctrl+ляв бутон в близост до 3 пиксела около линия на обекта). Получената сцена да се съхранява и чете от файл. File/New да изчиства създаденото изображение, като предложи съхраняване, ако такова не е извършено.

Благодаря предварително! icon_smile.gif
PMEmail Poster
Top
devil
Публикувано на: 22-04-2023, 21:42
Quote Post



Име: Ангелов
Група: Потребител
Ранг: Почетен член

Мнения: 1505
Регистриран на: 17.05.04



Google Bard (за разнообразие) казва, че нещата изглеждат така. Факт е обаче, че онлайн компилаторите връщат множество грешки и не изпълняват горния код. Къде е истината не мога да кажа - нищо не разбирам от C++...

CODE

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Point {
 int x, y;
};

struct Rectangle {
 Point p1, p2;
};

vector<Rectangle> rectangles;

void onMouseDown(int x, int y) {
 // If the left mouse button is pressed, create a new rectangle.
 if (GetKeyState(VK_LBUTTON) & 0x80) {
   rectangles.push_back({Point{x, y}, Point{x, y}});
 }
 // If the right mouse button is pressed, delete the rectangle under the mouse cursor.
 else if (GetKeyState(VK_RBUTTON) & 0x80) {
   auto it = find_if(rectangles.begin(), rectangles.end(), [&](const Rectangle &r) {
     return abs(r.p1.x - x) <= 3 && abs(r.p1.y - y) <= 3;
   });
   if (it != rectangles.end()) {
     rectangles.erase(it);
   }
 }
}

void onMouseMove(int x, int y) {
 // Update the position of the selected rectangle.
 if (rectangles.size() > 0) {
   rectangles.back().p2 = Point{x, y};
 }
}

void onSave() {
 // Save the scene to a file.
 ofstream file("scene.txt");
 for (const auto &r : rectangles) {
   file << r.p1.x << " " << r.p1.y << " " << r.p2.x << " " << r.p2.y << endl;
 }
 file.close();
}

void onNew() {
 // Clear the scene.
 rectangles.clear();
}

int main() {
 // Initialize the window.
 RECT rect = {0, 0, 640, 480};
 CreateWindow("Scene Creator", NULL, WS_OVERLAPPEDWINDOW, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, NULL, NULL);

 // Set the mouse callback functions.
 SetMouseDownCallback(onMouseDown);
 SetMouseMoveCallback(onMouseMove);

 // Start the message loop.
 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0)) {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
 }

 return 0;
}


--------------------
PMUsers WebsiteICQ
Top
akrachev
Публикувано на: 23-04-2023, 21:25
Quote Post



Име: акрачев
Група: Потребител
Ранг: Почетен член

Мнения: 985
Регистриран на: 27.11.09



И къде е дефинирана SetMouseDownCallback и CreateWindow - няма windows.h


--------------------
PMEmail PosterUsers Website
Top
samolet4e
Публикувано на: 23-04-2023, 22:15
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 14
Регистриран на: 16.03.22



Мога да предложа една реализация на Simple and Fast Media Library (SFML). Програмата добавя (с LMB) и изважда (с RMB) правоъгълници във вектор. Кодът е следният:

CODE

#include <SFML/Graphics.hpp>
#include <iostream>

int main() {

   std::vector <sf::RectangleShape> rect(1);

   sf::RenderWindow window(sf::VideoMode(960, 540), "Rectangles Interactive", sf::Style::Default, sf::ContextSettings(32));
   window.setVerticalSyncEnabled(true);
   window.setActive(true);

   bool running = true;
   while (running) {

       sf::Event event;
       while (window.pollEvent(event)) {

           static sf::Vector2i mousePosOnClick;
           sf::Vector2i mousePosOnHold;
           sf::RectangleShape mouseDrawnBox;

                if (event.type == sf::Event::Closed) running = false;
           else if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) running = false;
           else if ((event.type == sf::Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left)) {

               rect.push_back(rect.at(rect.size()-1));
               mousePosOnClick.x = event.mouseButton.x;
               mousePosOnClick.y = event.mouseButton.y;

           }//if
           if ((event.type == sf::Event::MouseMoved) && (sf::Mouse::isButtonPressed(sf::Mouse::Left))) {

               mousePosOnHold.x = event.mouseMove.x;
               mousePosOnHold.y = event.mouseMove.y;

               sf::Vector2f size((mousePosOnHold.x - mousePosOnClick.x), (mousePosOnHold.y - mousePosOnClick.y));
               mouseDrawnBox.setPosition(mousePosOnClick.x, mousePosOnClick.y);
               mouseDrawnBox.setSize(size);

               rect.pop_back();
               mouseDrawnBox.setFillColor(sf::Color::Yellow);
               mouseDrawnBox.setOutlineColor(sf::Color::Black);
               mouseDrawnBox.setOutlineThickness(-1);
               rect.push_back(mouseDrawnBox);

           }//if
           else if ((event.type == sf::Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Right)) {
               auto mpos = window.mapPixelToCoords(sf::Mouse::getPosition(window));
               if (mpos.x >= 0 && mpos.x < window.getSize().x && mpos.y >= 0 && mpos.y < window.getSize().y) {
                   auto shapeIt = rect.begin();
                   while (shapeIt != rect.end()) {
                       auto it = *shapeIt;
                       if (it.getGlobalBounds().contains(mpos.x, mpos.y))
                           shapeIt = rect.erase(shapeIt);
                       else
                           ++shapeIt;
                   }//while
               }//if
           }//if
           else {}

       }//while

       window.clear(sf::Color::White);
       for (int i = 0; i < (int)rect.size(); i++) window.draw(rect.at(i));
       window.display();
       std::cout << "Shapes available: " << (int)rect.size()-1 << std::endl;

   }//while

   window.close();
   rect.clear();

   return 0;
}//main


Как се инсталира SFML пише тук:

SFML Install

Ако проявявате интерес, ще обсъдим програмата в подробности. Съхранението на вектора във файл оставям за подобрена версия.

По материали от чуждестранния печат:

Forum 1
Forum 2


Прикачена картинка (Кликнете на картинката, за да я увеличите!)
Прикачена картинка
PMEmail Poster
Top
chochyy
Публикувано на: 25-04-2023, 14:02
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 22.04.23



Благодаря Ви! icon_smile.gif
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0