symbolic mathnet c# math graphics geometry

mathnet - c# symbolic math



Compruebe si un punto está en un rectángulo girado(C#) (6)

Tengo un programa en C # (Windows Forms) que dibuja algunos rectángulos en un picturebox. También se pueden dibujar en ángulo (girados).

Conozco cada punto de inicio de los rectángulos (esquina superior izquierda), su tamaño (ancho + alto) y su ángulo. Debido a la rotación, el punto de inicio no es necesariamente la esquina superior izquierda, pero eso no importa aquí. Luego, cuando hago clic en el cuadro de imágenes, debo comprobar en qué rectángulo (si corresponde) he hecho clic.

Así que necesito alguna forma de verificar si un punto está en un rectángulo, pero también debo tener en cuenta la rotación de cada rectángulo. ¿Alguien sabe de una manera de hacer esto en C #?


¿Es posible aplicar la misma rotación aplicada al rectángulo al punto en reversa?

Por ejemplo, el Rectángulo A se gira 45 grados en el sentido de las agujas del reloj desde su origen (esquina superior izquierda), entonces simplemente giraría el punto B alrededor del mismo origen 45 grados CONTADOR en el sentido de las agujas del reloj, luego verificará si se encuentra dentro del Rectángulo A antes de la rotación


¿Se permitiría que los rectángulos se superpongan? Si es así, ¿desearías todos los rectángulos en un punto, o solo uno en la capa superior?


Editar: Después de mirar hacia atrás, estoy usando MonoGame y el OP está usando Windows Forms. Lo siguiente es para MonoGame.

He estado ensuciando esto por un tiempo y he encontrado un par de respuestas, pero ninguna de ellas realmente funcionó. Aquí hay una función de C # que hace exactamente lo que OP describe, si no es así para OP, entonces otras personas buscarán en Google como yo.

Fue un dolor de cabeza resolver esto. Muchas de las conjeturas típicas.

bool PointIsInRotatedRectangle(Vector2 P, Rectangle rect, float rotation) { Matrix rotMat = Matrix.CreateRotationZ(-rotation); Vector2 Localpoint = P - (rect.Location).ToVector2(); Localpoint = Vector2.Transform(Localpoint, rotMat); Localpoint += (rect.Location).ToVector2(); if (rect.Contains(Localpoint)) { return true; } return false; }

Y aquí está en una sola línea de código. Probablemente más rápido de usar.

bool PointIsInRotatedRectangle(Vector2 P, Rectangle rect, float rotation) { if ( rect.Contains(Vector2.Transform(P - (rect.Location).ToVector2(), Matrix.CreateRotationZ(-rotation)) + (rect.Location).ToVector2()) ) { return true; } return false; }


Sé que esto ya fue respondido pero tuve que hacer algo similar hace un tiempo. Creé un método de extensión para la clase System.Windows.Point que ayudó a hacer exactamente lo que Neil sugirió:

public static double GetAngle(this Point pt) { return Math.Atan2(pt.X, -pt.Y) * 180 / Math.PI; } public static Point SetAngle(this Point pt, double angle) { var rads = angle * (Math.PI / 180); var dist = Math.Sqrt(pt.X * pt.X + pt.Y * pt.Y); pt.X = Math.Sin(rads) * dist; pt.Y = -(Math.Cos(rads) * dist); return pt; }

Esto me permitiría trabajar con los ángulos de los puntos alrededor de 0, 0. Entonces, si conoce el centro del rectángulo que está probando, compensaría el punto con el negativo de este valor (por ejemplo: pt.X - = 32 ; pt.Y - = 32) Y luego aplicarías la rotación negativa del rectángulo (como lo sugiere Neil: pt.SetAngle (-45);) ...

Ahora, si el punto está dentro de 64, 64 sabes que golpeaste el rectángulo. Más específicamente, estaba revisando un píxel de una imagen girada para asegurarme de que golpeara un píxel de un color específico.



Podría mantener una segunda imagen no desplegada donde dibuje duplicados de los rectángulos, cada uno de un color único. Cuando el usuario haga clic en la picturebox, busque el color del píxel correspondiente en la segunda imagen, que identificará en qué rectángulo se hizo clic.