gpt4 book ai didi

c# - 根据两点旋转图像

转载 作者:太空狗 更新时间:2023-10-29 20:27:21 24 4
gpt4 key购买 nike

我的表单上有两个点和一个图片框,如下所示:

*

[^]
[ ]

*

我想将图片框与点对齐,使其看起来像这样:

*

\^\
\ \

*

如何计算角度以及如何旋转 PictureBox?

目前我正在使用这个:

double xDifference = Math.Abs(point2.X - point1.X);
double yDifference = Math.Abs(point2.Y - point1.Y);

double angle = Math.Atan(yDifference / xDifference) * 180 / Math.PI;

但这不起作用,因为 x 和 y 值是绝对值,因此如果点 2 位于点 1 的左侧,则它们无法计算它。

为了旋转图片,我找到了如下函数:

    public Bitmap rotateImage(Image image, PointF offset, float angle) {
// Create a new empty bitmap to hold rotated image
Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

// Make a graphics object from the empty bitmap
Graphics g = Graphics.FromImage(rotatedBmp);

// Put the rotation point in the center of the image
g.TranslateTransform(offset.X, offset.Y);

// Rotate the image
g.RotateTransform(angle);

// Move the image back
g.TranslateTransform(-offset.X, -offset.Y);

// Draw passed in image onto graphics object
g.DrawImage(image, new PointF(0, 0));

return rotatedBmp;
}

我将如何使用该功能?我不确定要为偏移量插入什么值。

谢谢

最佳答案

我不喜欢在不必要的时候使用角度。

在这里,您只想改变正交基。

您想从 {X;Y} 移动到 {U;V},其中 V(范数 1)平行于 AB(或点 1 点 2)。

因为 {U;V} 是正交基,Ux = Vy 且 Uy = -Vx。

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace CsiChart
{
public partial class CustomControl1 : Control
{
private const float EPSILON = 1e-6f;

private Image _image;
private ImageLayout _imageLayout = ImageLayout.Center;
private PointF _pointA = new PointF(0, 100);
private PointF _pointB = new PointF(100, 0);

public CustomControl1()
{
InitializeComponent();
}

public Image Image
{
get { return _image; }
set
{
if (Equals(_image, value)) return;
_image = value;
Invalidate();
OnImageChanged(EventArgs.Empty);
}
}

public event EventHandler ImageChanged;

public ImageLayout ImageLayout
{
get { return _imageLayout; }
set
{
if (Equals(_imageLayout, value)) return;
_imageLayout = value;
Invalidate();
OnImageLayoutChanged(EventArgs.Empty);
}
}

public event EventHandler ImageLayoutChanged;

public PointF PointA
{
get { return _pointA; }
set
{
if (Equals(_pointA, value)) return;
_pointA = value;
Invalidate();
OnPointAChanged(EventArgs.Empty);
}
}

public event EventHandler PointAChanged;

public PointF PointB
{
get { return _pointB; }
set
{
if (Equals(_pointB, value)) return;
_pointB = value;
Invalidate();
OnPointBChanged(EventArgs.Empty);
}
}

public event EventHandler PointBChanged;

protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
if (DesignMode) return;

var g = pe.Graphics;
g.Clear(BackColor);

var image = Image;
if (image == null) return;

var clientRectangle = ClientRectangle;
var centerX = clientRectangle.X + clientRectangle.Width / 2;
var centerY = clientRectangle.Y + clientRectangle.Height / 2;

var srcRect = new Rectangle(new Point(0, 0), image.Size);

var pointA = PointA;
var pointB = PointB;

// Compute U, AB vector normalized.
var vx = pointB.X - pointA.X;
var vy = pointB.Y - pointA.Y;
var vLength = (float) Math.Sqrt(vx*vx + vy*vy);
if (vLength < EPSILON)
{
vx = 0;
vy = 1;
}
else
{
vx /= vLength;
vy /= vLength;
}

var oldTransform = g.Transform;

// Change basis to U,V
// We also take into acount the inverted on screen Y.
g.Transform = new Matrix(-vy, vx, -vx, -vy, centerX, centerY);

var imageWidth = image.Width;
var imageHeight = image.Height;

RectangleF destRect;
switch (ImageLayout)
{
case ImageLayout.None:
destRect = new Rectangle(0, 0, imageWidth, imageHeight);
break;
case ImageLayout.Center:
destRect = new Rectangle(-imageWidth/2, -imageHeight/2, imageWidth, imageHeight);
break;
case ImageLayout.Zoom:
// XY aligned bounds size of the image.
var imageXSize = imageWidth*Math.Abs(vy) + imageHeight*Math.Abs(vx);
var imageYSize = imageWidth*Math.Abs(vx) + imageHeight*Math.Abs(vy);

// Get best scale to fit.
var s = Math.Min(clientRectangle.Width/imageXSize, clientRectangle.Height/imageYSize);
destRect = new RectangleF(-imageWidth*s/2, -imageHeight*s/2, imageWidth*s, imageHeight*s);
break;
default:
throw new InvalidOperationException();
}

g.DrawImage(image, destRect, srcRect, GraphicsUnit.Pixel);
g.Transform = oldTransform;
}

protected virtual void OnImageChanged(EventArgs eventArgs)
{
var handler = ImageChanged;
if (handler == null) return;
handler(this, eventArgs);
}

protected virtual void OnImageLayoutChanged(EventArgs eventArgs)
{
var handler = ImageLayoutChanged;
if (handler == null) return;
handler(this, eventArgs);
}

private void OnPointAChanged(EventArgs eventArgs)
{
var handler = PointAChanged;
if (handler == null) return;
handler(this, eventArgs);
}

private void OnPointBChanged(EventArgs eventArgs)
{
var handler = PointBChanged;
if (handler == null) return;
handler(this, eventArgs);
}
}
}

关于c# - 根据两点旋转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27547257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com