四个方向 分块渲染
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include "Selection_Rectangle_Overlay.h"
|
||||
#include "Plottable_Real_Time_Data.h"
|
||||
#include "Heatmap_Utils.h"
|
||||
#include "../render/Blend2D_Cache.h"
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
@@ -14,12 +15,8 @@ struct Selection_Interaction {
|
||||
PointF selection_current{};
|
||||
};
|
||||
using Selection_Interaction_State = Double_State_Strategy<Selection_Interaction_Base, Selection_Interaction>;
|
||||
RectF axis_content_rect(const Axis_Transform& horizontal, const Axis_Transform& vertical) {
|
||||
const double x1 = horizontal.coord_to_pixel(horizontal.coordinate_range.origin);
|
||||
const double x2 = horizontal.coord_to_pixel(horizontal.coordinate_range.target);
|
||||
const double y1 = vertical.coord_to_pixel(vertical.coordinate_range.origin);
|
||||
const double y2 = vertical.coord_to_pixel(vertical.coordinate_range.target);
|
||||
return {std::min(x1, x2), std::min(y1, y2), std::abs(x2 - x1), std::abs(y2 - y1)};
|
||||
RectF axis_content_rect(const Axis_Transform& first, const Axis_Transform& second) {
|
||||
return mapped_rect(first, second, first.coordinate_range, second.coordinate_range);
|
||||
}
|
||||
}
|
||||
struct Selection_Rectangle_Overlay_Control::Impl {
|
||||
@@ -88,9 +85,11 @@ void Selection_Rectangle_Overlay_Control::handle_event(const Event& event) {
|
||||
return;
|
||||
const Axis_Transform horizontal = impl_->horizontal_axis->transform();
|
||||
const Axis_Transform vertical = impl_->vertical_axis->transform();
|
||||
const RectF region{horizontal.pixel_to_coord(start.x), vertical.pixel_to_coord(start.y),
|
||||
horizontal.pixel_to_coord(pointer.position.x) - horizontal.pixel_to_coord(start.x),
|
||||
vertical.pixel_to_coord(pointer.position.y) - vertical.pixel_to_coord(start.y)};
|
||||
const double first_start = horizontal.point_to_coord(start);
|
||||
const double second_start = vertical.point_to_coord(start);
|
||||
const RectF region{first_start, second_start,
|
||||
horizontal.point_to_coord(pointer.position) - first_start,
|
||||
vertical.point_to_coord(pointer.position) - second_start};
|
||||
if(std::abs(region.width) > 1e-9 && std::abs(region.height) > 1e-9)
|
||||
impl_->regions.update(region.normalized());
|
||||
event.accept();
|
||||
@@ -106,7 +105,9 @@ void Selection_Rectangle_Overlay_Control::paint(Painter& painter, const Render_S
|
||||
const auto horizontal = impl_->horizontal_axis->transform(view);
|
||||
const auto vertical = impl_->vertical_axis->transform(view);
|
||||
for(const RectF& region : view.get(impl_->regions)) {
|
||||
RectF pixels{horizontal.coord_to_pixel(region.x), vertical.coord_to_pixel(region.y), horizontal.coord_to_pixel(region.right()) - horizontal.coord_to_pixel(region.x), vertical.coord_to_pixel(region.bottom()) - vertical.coord_to_pixel(region.y)};
|
||||
const RectF pixels = mapped_rect(horizontal, vertical,
|
||||
{region.x, region.right()},
|
||||
{region.y, region.bottom()});
|
||||
painter.rect(pixels, state.selection_border_pen, state.selection_brush);
|
||||
std::ostringstream text;
|
||||
text << region.width << " x " << region.height;
|
||||
|
||||
Reference in New Issue
Block a user