Интерактивные полигоны Вороного? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать диаграмму Вороного, которая выглядит следующим образом (на данный момент это тоже мой вывод):

enter image description here

и мойВопрос был в том, как я могу сделать это интерактивным.И с этим я имею в виду, что я хочу иметь возможность установить черные точки, а затем он должен приспособиться к карте и создать многоугольник Вороного.

Структура кода моего проекта содержит 2 класса заголовков, один из которых - это Вороной.вычисляется, второе - это растровое изображение, и, как и для последнего, main.cpp.

классы выглядят следующим образом:

voronoi.h

    #pragma once

#include "stdafx.h"
#include "MyBitmap.h"
#include <windows.h>
#include <vector>
#include <string>

static int DistanceSqrd(const Point& point, int x, int y) {
    int xd = x - point.x;
    int yd = y - point.y;
    return (xd * xd) + (yd * yd);
}

class Voronoi {
public:
    void Make(MyBitmap* bmp, int count) {
        bmp_ = bmp;
        CreatePoints(count);
        CreateColors();
        CreateSites();
        SetSitesPoints();
    }

    void CreateSites() { //voronoi triangulation mathematics
        int w = bmp_->width(), h = bmp_->height(), d;

        for (int hh = 0; hh < h; hh++) {
            for (int ww = 0; ww < w; ww++) {

                int ind = -1, dist = INT_MAX;

                for (size_t it = 0; it < points_.size(); it++) {
                    const Point& p = points_[it];
                    d = DistanceSqrd(p, ww, hh); //lines between points
                    if (d < dist) {
                        dist = d;
                        ind = it;
                    }
                }

                if (ind > -1)
                    SetPixel(bmp_->hdc(), ww, hh, colors_[ind]);
                else
                    __asm nop // should never happen!
            }
        }
    }
    void SetSitesPoints() {
        for (const auto& point : points_) {
            int x = point.x, y = point.y;

            for (int i = -1; i < 2; i++)
                for (int j = -1; j < 2; j++)
                    SetPixel(bmp_->hdc(), x + i, y + j, 0);
        }
    }

    void CreatePoints(int count) {
        const int w = bmp_->width() - 20, h = bmp_->height() - 20;

        for (int i = 0; i < count; i++) {
            points_.push_back({ rand() % w + 10, rand() % h + 10 }); //where the black points are placed.
        }
    }

    void CreateColors() {
        for (size_t i = 0; i < points_.size(); i++) {
            DWORD c = RGB(255, 0,0); //red
            DWORD d = RGB(0, 0, 255); //blue

            colors_.push_back(c);
            colors_.push_back(d);
        }
    }

    vector<Point> points_;
    vector<DWORD> colors_;
    MyBitmap* bmp_;
};

этоОтветственный за алгоритмы ВороногоЯ хочу иметь возможность размещать черные точки / полигоны Вороного, которые подстраиваются под другие полигоны Вороного, и я пока не нашел способа сделать это.

Это должно быть сделано щелчком мыши и положением мышинад которым я сейчас работаю.

Также нормально, если он запустит Blanco без каких-либо полигонов Вороного.

У меня есть хороший пример для этого из здесь .

Я знаю, что он делает (например,кроме MyBitmap.h), но я получил исходный код от здесь .

1 Ответ

0 голосов
/ 29 ноября 2018

Я наконец получил ответ.Я сделал метод в voronoi, который получает точки на позиции мыши, который выглядит следующим образом:

void GetPointsOnMousePosition() {
        int x, y;
        SDL_GetMouseState(&x, &y);
        int d;
        isClicked = true;
        cout << x << " and " << y << endl;

        points_.push_back({ x, y }); //where the black points are placed.
        CreateColors();
        CreateSites();
        SetSitesPoints();
    }

, он получает позицию мыши и устанавливает ее на x и y и помещает ее в массив точек.и в main.cpp я попросил метод pointsOnMousePosition перезагрузил bmp и сохранил его следующим образом:

if (e.button.button == SDL_BUTTON_LEFT) {
                        //bmp.~MyBitmap();
                        cout << "left button pressed" << endl;
                        v.GetPointsOnMousePosition();

                        //adjusts the voronoi map
                        bmp.SaveBitmap("v.bmp");
                        gImageSurface = SDL_LoadBMP("v.bmp");
                        cout << "points added!" << endl;
                        isClicked = false;
                    }

Надеюсь, это поможет кому-то в будущем.

...