Я пытаюсь реализовать опцию увеличения масштаба на графике, позволяя пользователю выбрать желаемую область (показано пи c). График не занимает весь экран. Он варьируется от -0,8 до +1,4 по оси Y.
После увеличения:
Увеличение выполняется путем масштабирования и перевода матрица проекции в событии OnRenderFrame
.
Xscale= 1, Yscale=1, Xtrans =0, Ytrans =0;
protected override void OnRenderFrame(FrameEventArgs e)
{
GL.ClearColor(Color4.Black);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
for (int j = 0; j < lines.Count(); j++)
{
projection = Matrix4.CreateOrthographicOffCenter(-1.0f, 1.0f, -1.0f, 1.0f, -2f, 2.0f);
Matrix4 Translate = Matrix4.CreateTranslation(Xtrans, Ytrans, 0);
Matrix4 Scale = Matrix4.CreateScale(1/Xscale, 1/Yscale, 1);
projection = Translate* Scale* projection;
view = Matrix4.LookAt(CameraPos,
CameraPos + CameraFront, CameraUp);
shader.Use();
shader.SetMatrix4("model", Matrix4.Identity);
shader.SetMatrix4("view", view);
shader.SetMatrix4("projection", projection);
shader.SetFloat("color", new Vector4(colors.names[i]));
GL.BindVertexArray(VAO[i]);
GL.DrawArrays(PrimitiveType.LineStrip, 0, Y1Vertices[0].Count());
shader.Unbind();
GL.BindVertexArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
}
SwapBuffers();
base.OnRenderFrame(e);
}
Я получаю коэффициенты масштабирования, находя соотношение между размерами прямоугольника и размерами экрана. Для перевода я пытаюсь найти разницу между источником прямоугольника и источником экрана, а затем перевести объект на эту величину. Масштабирование работает правильно, но не перевод. Я думаю, возможно, проблема в том, что мой объект изначально не заполняет экран, как в go от -1 до 1 по оси Y? Я не уверен, как учесть это смещение, тем более, что оно меняется в зависимости от данных графика. Я также предпочел бы, чтобы увеличение не занимало весь экран и оставалось в пределах начальных размеров графика. Не могли бы вы помочь мне?
protected override void OnMouseDown(MouseButtonEventArgs e)
{
if(e.Button == MouseButton.Right)
{
initialPos = new Vector2(e.X, e.Y);
}
base.OnMouseDown(e);
}
protected override void OnMouseMove(MouseMoveEventArgs e)
{
MouseState mstate = Mouse.GetCursorState();
if (e.Mouse[MouseButton.Right])
{
mouseDown = true;
newPos = new Vector2(e.X, e.Y);
}
base.OnMouseMove(e);
}
protected override void OnMouseUp(MouseButtonEventArgs e)
{
if (e.Button == MouseButton.Right)
{
Xscale *= (Math.Abs(newPos.X - initialPos.X)) / this.Width;
Yscale *= (Math.Abs(newPos.Y - initialPos.Y) / this.Height);
Xtrans = (((newPos.X + initialPos.X) / 2)-(this.Width/2))/this.Width;
Ytrans = (((newPos.Y + initialPos.Y) / 2) - (this.Height / 2)) / this.Height;
}
base.OnMouseUp(e);
}
Редактировать:
После изменения на projection = Scale*Translate* projection;