Я пытаюсь создать диаграмму Вороного, которая выглядит следующим образом (на данный момент это тоже мой вывод):
и мойВопрос был в том, как я могу сделать это интерактивным.И с этим я имею в виду, что я хочу иметь возможность установить черные точки, а затем он должен приспособиться к карте и создать многоугольник Вороного.
Структура кода моего проекта содержит 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), но я получил исходный код от здесь .