epezent / epezent/implot

Point graphs linkage

Open
#573 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
6.2k
Forks
693
PR merge metrics
No merged PRs in 30d

Description

I'm new to ImPlot, so perhaps I'm misunderstanding / misusing the DragPoint mechanism.
But I have 2 separate plots and for a reason I do not understand, some of the points inside each graph are linked to each other...

```cpp
ImPlotFlags plot_flags = ImPlotFlags_CanvasOnly | ImPlotFlags_Equal | ImPlotFlags_Crosshairs;
ImPlotAxisFlags axis_flags = ImPlotAxisFlags_Lock | ImPlotAxisFlags_NoSideSwitch;

if (ImPlot::BeginPlot("Bezier Quadratic", { 250, 250 }, plot_flags))
{
ImPlot::SetupAxes(NULL, NULL, axis_flags, axis_flags);

static std::array control_points_quadratic = {
glm::dvec2{ 0.0, 0.0 },
glm::dvec2{ 0.5, 0.5 },
glm::dvec2{ 1.0, 1.0 }
};

for (int i = 0; i < 3; i++)
{
control_points_quadratic[i] = glm::clamp(control_points_quadratic[i], glm::dvec2{ 0.0, 0.0 }, glm::dvec2{ 1.0, 1.0 });
ImPlot::DragPoint(
i,
&control_points_quadratic[i].x,
&control_points_quadratic[i].y,
{ 0.f, 0.f, 0.f, 1.f }, 5.f,
(i == 0 || i == 2 ? ImPlotDragToolFlags_NoInputs : ImPlotDragToolFlags_None)
);
}

std::array points = {};

for (int i = 0; i <= 100; i++)
{
double t = i / 100.0;

glm::dvec2 l0 = (1.0 - t) * control_points_quadratic[0] + t * control_points_quadratic[1];
glm::dvec2 l1 = (1.0 - t) * control_points_quadratic[1] + t * control_points_quadratic[2];
glm::dvec2 q0 = (1.0 - t) * l0 + t * l1;

points[i] = ImPlotPoint(q0.x, q0.y);
}

ImPlot::PlotLine("##quad", &points[0].x, &points[0].y, 101, 0, 0, sizeof(ImPlotPoint));

ImPlot::EndPlot();
}

ImGui::SameLine();

if (ImPlot::BeginPlot("Bezier Cubic", { 250, 250 }, plot_flags))
{
ImPlot::SetupAxes(NULL, NULL, axis_flags, axis_flags);

static std::array control_points_cubic = {
glm::dvec2{ 0.0, 0.0 },
glm::dvec2{ 0.3, 0.3 },
glm::dvec2{ 0.6, 0.6 },
glm::dvec2{ 1.0, 1.0 }
};

for (int i = 0; i < 4; i++)
{
control_points_cubic[i] = glm::clamp(control_points_cubic[i], glm::dvec2{ 0.0, 0.0 }, glm::dvec2{ 1.0, 1.0 });
ImPlot::DragPoint(
i,
&control_points_cubic[i].x,
&control_points_cubic[i].y,
{ 0.f, 0.f, 0.f, 1.f }, 5.f,
(i == 0 || i == 3 ? ImPlotDragToolFlags_NoInputs : ImPlotDragToolFlags_None)
);
}

std::array points = {};

for (int i = 0; i <= 100; i++)
{
double t = i / 100.0;

glm::dvec2 l0 = (1.0 - t) * control_points_cubic[0] + t * control_points_cubic[1];
glm::dvec2 l1 = (1.0 - t) * control_points_cubic[1] + t * control_points_cubic[2];
glm::dvec2 l2 = (1.0 - t) * control_points_cubic[2] + t * control_points_cubic[3];
glm::dvec2 q0 = (1.0 - t) * l0 + t * l1;
glm::dvec2 q1 = (1.0 - t) * l1 + t * l2;
glm::dvec2 c0 = (1.0 - t) * q0 + t * q1;

points[i] = ImPlotPoint(c0.x, c0.y);
}

ImPlot::PlotLine("##cubic", &points[0].x, &points[0].y, 101, 0, 0, sizeof(ImPlotPoint));

ImPlot::EndPlot();
}
```

https://github.com/epezent/implot/assets/63611551/5a29c65e-8a41-4b1c-beca-e1b291cee509

Any help or recommendations are appreciated.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.