#include "MapPresent.h" MapPresent::MapPresent(QWidget* parent /*= nullptr*/) :QWidget(parent) { } #include #include PresentIndex MapPresent::indexGet(const QPointF& pos) const { return PresentIndex(); } #include QRectF MapPresent::outlineGet(const PresentIndex& idx) const { auto widget_rect = this->rect(); auto widget_center = widget_rect.center(); const float ap_len = _primitive_region_square_len / 2; auto a2_vec = ap_len * sqrt(3) / 2; auto n_yinc = QVector3D(a2_vec, ap_len * 3 / 2, 0); auto n_xinc = QVector3D(a2_vec, -ap_len * 3 / 2, 0); auto xinc = idx.row - _center_index.row; auto yinc = idx.col - _center_index.col; auto target_center = QVector3D(widget_center) + n_yinc * yinc + n_xinc * xinc; target_center -= QVector3D(ap_len, ap_len, 0); return QRectF(target_center.toPointF(), QSizeF(ap_len * 2, ap_len * 2)); } #include void MapPresent::paintEvent(QPaintEvent* ev) { QWidget::paintEvent(ev); QPainter p(this); BasicUnitDelegate t; p.save(); p.setPen(Qt::red); auto rect = outlineGet(_center_index); p.translate(rect.topLeft()); rect.moveTo(0, 0); PresentOption opt; opt.selfIndex = _center_index; opt.selfOutline = rect; t.paint(&p, opt); p.restore(); for (auto idx = 1; idx < 10; ++idx) { auto siblings = siblingsGet(_center_index, idx); p.setPen(Qt::green); for (auto item : siblings) { auto rect = outlineGet(item); p.save(); p.translate(rect.topLeft()); rect.moveTo(0, 0); //p.drawRect(rect); opt.selfIndex = item; opt.selfOutline = rect; t.paint(&p, opt); p.restore(); } } } QList MapPresent::siblingsGet(const PresentIndex& center, uint16_t dist) const { QList e6_points; e6_points << PresentIndex{ center.row, center.col - dist }; e6_points << PresentIndex{ center.row + dist, center.col }; e6_points << PresentIndex{ center.row + dist, center.col + dist }; e6_points << PresentIndex{ center.row, center.col + dist }; e6_points << PresentIndex{ center.row - dist, center.col }; e6_points << PresentIndex{ center.row - dist, center.col - dist }; e6_points << PresentIndex{ center.row, center.col - dist }; QList values; for (auto idx = 0; idx < 6; ++idx) { auto ap = e6_points[idx]; auto bp = e6_points[idx + 1]; values << itemFills(ap, bp); } return values; } QList MapPresent::itemFills(const PresentIndex& a, const PresentIndex& b) const { QList items; auto sign_row = (a.row == b.row) ? 0 : ((b.row - a.row) / std::abs(a.row - b.row)); auto sign_col = (a.col == b.col) ? 0 : ((b.col - a.col) / std::abs(a.col - b.col)); auto temp_pt = a; while (temp_pt != b) { items << temp_pt; temp_pt += PresentIndex{ sign_row, sign_col }; } return items; } PresentIndex& PresentIndex::operator+=(const PresentIndex& other) { row += other.row; col += other.col; return *this; } bool PresentIndex::operator!=(const PresentIndex& other) const { return row != other.row || col != other.col; } int BasicUnitDelegate::unitType() const { return 0; } void BasicUnitDelegate::paint(QPainter* p, const PresentOption& option) { auto rect = option.selfOutline; auto center = rect.center(); auto alen = rect.width() / 2; const float xspan = alen * sqrt(3) / 2; QList points = endPointsGet(rect); QVector lines; for (auto idx = 0; idx < 6; ++idx) { lines << QLineF(points[idx], points[idx + 1]); } p->drawLines(lines); auto ft = p->font(); ft.setPixelSize(alen * 0.3); p->setFont(ft); auto text_rect = QRectF(center.x() - xspan, center.y() - alen / 2, xspan * 2, alen); auto text_str = QString("(%1,%2)").arg(option.selfIndex.row).arg(option.selfIndex.col); p->drawText(text_rect, Qt::AlignCenter, text_str); } QList BasicUnitDelegate::endPointsGet(const QRectF& rect) { auto center = rect.center(); auto alen = rect.width() / 2; const float xspan = alen * sqrt(3) / 2; QList points; points << QPointF(center.x() - xspan, center.y() - alen / 2); points << QPointF(center.x(), 0); points << QPointF(center.x() + xspan, center.y() - alen / 2); points << QPointF(center.x() + xspan, center.y() + alen / 2); points << QPointF(center.x(), rect.height()); points << QPointF(center.x() - xspan, center.y() + alen / 2); points << QPointF(center.x() - xspan, center.y() - alen / 2); return points; }