1、已知两点A,B
2、两点构成线段P
3、线段P1与P垂直并经过A,两端为C、D
4、线段P2与P垂直并经过B,两端为E、F
5、P1、P2长度为100,A/B分别为两个线段中点
求P2、P2的4个端点C、D、E、F
void testCode(Vector2 A, Vector2 B)
{
float k = getSlope(B, A);
float angle;
Vector2 C = Vector2.zero;
Vector2 D = Vector2.zero;
Vector2 E = Vector2.zero;
Vector2 F = Vector2.zero;
if (float.IsInfinity(k))
{
//斜率不存在,与y轴平行,为竖线
//print(k);
C = new Vector2(B.x - pointOffset, B.y);
D = new Vector2(B.x + pointOffset, B.y);
E = new Vector2(A.x - pointOffset, A.y);
F = new Vector2(A.x + pointOffset, A.y);
GlobalFunction.Instance.drawRect(C, D, E, F);
return;
}
if (k == 0)
{
//斜率=0,与x轴平行,为横线
//print(angle);
C = new Vector2(B.x, B.y - pointOffset);
D = new Vector2(B.x, B.y + pointOffset);
E = new Vector2(A.x, A.y - pointOffset);
F = new Vector2(A.x, A.y + pointOffset);
GlobalFunction.Instance.drawRect(C, D, E, F);
return;
}
if (k > 0)
{
//锐角
angle = Mathf.Atan(k) * 180 / Mathf.PI;
float newAngle = (90 - angle) / 180 * Mathf.PI; // 180 - 90 - angle
float x1 = Mathf.Cos(newAngle) * pointOffset;
float y1 = Mathf.Sin(newAngle) * pointOffset;
C = new Vector2(B.x - x1, B.y + y1);
D = new Vector2(B.x + x1, B.y - y1);
E = new Vector2(A.x - x1, A.y + y1);
F = new Vector2(A.x + x1, A.y - y1);
GlobalFunction.Instance.drawRect(C, D, E, F);
return;
}
if (k < 0)
{
//钝角
angle = Mathf.Atan(k) * 180 / Mathf.PI;
//print(angle);
float newAngle = (90 - angle) / 180 * Mathf.PI; // 90 - angle
float x1 = Mathf.Cos(newAngle) * pointOffset;
float y1 = Mathf.Sin(newAngle) * pointOffset;
C = new Vector2(B.x + x1, B.y - y1);
D = new Vector2(B.x - x1, B.y + y1);
E = new Vector2(A.x + x1, A.y - y1);
F = new Vector2(A.x - x1, A.y + y1);
GlobalFunction.Instance.drawRect(C, D, E, F);
return;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GlobalFunction : SceneMonoSingleton<GlobalFunction>
{
public Text text = null;
public List<RectTransform> pointList = new List<RectTransform>();
public Material mat = null;
public Image img = null;
private Image p1 = null;
private Image p2 = null;
private Image p3 = null;
private Image p4 = null;
void Start()
{
p1 = Instantiate(img);
p1.name = "p1";
p2 = Instantiate(img);
p2.name = "p2";
p3 = Instantiate(img);
p3.name = "p3";
p4 = Instantiate(img);
p4.name = "p4";
p1.transform.SetParent(img.transform);
p2.transform.SetParent(img.transform);
p3.transform.SetParent(img.transform);
p4.transform.SetParent(img.transform);
}
public void drawRect(Vector2 C, Vector2 D, Vector2 E, Vector2 F)
{
//画线
float x1 = p1.GetComponent<RectTransform>().sizeDelta.x;
float y1 = Vector2.Distance(C, D);
p1.GetComponent<RectTransform>().sizeDelta = new Vector2(x1, y1);
p1.GetComponent<RectTransform>().anchoredPosition = C;
float a1 = Vector2.SignedAngle(C - D, Vector2.down);
p1.transform.localRotation = Quaternion.AngleAxis(-a1, Vector3.forward);
float x2 = p2.GetComponent<RectTransform>().sizeDelta.x;
float y2 = Vector2.Distance(D, F);
p2.GetComponent<RectTransform>().sizeDelta = new Vector2(x2, y2);
p2.GetComponent<RectTransform>().anchoredPosition = D;
float a2 = Vector2.SignedAngle(D - F, Vector2.down);
p2.transform.localRotation = Quaternion.AngleAxis(-a2, Vector3.forward);
float x3 = p3.GetComponent<RectTransform>().sizeDelta.x;
float y3 = Vector2.Distance(F, E);
p3.GetComponent<RectTransform>().sizeDelta = new Vector2(x3, y3);
p3.GetComponent<RectTransform>().anchoredPosition = F;
float a3 = Vector2.SignedAngle(F - E, Vector2.down);
p3.transform.localRotation = Quaternion.AngleAxis(-a3, Vector3.forward);
float x4 = p4.GetComponent<RectTransform>().sizeDelta.x;
float y4 = Vector2.Distance(E, C);
p4.GetComponent<RectTransform>().sizeDelta = new Vector2(x4, y4);
p4.GetComponent<RectTransform>().anchoredPosition = E;
float a4 = Vector2.SignedAngle(E - C, Vector2.down);
p4.transform.localRotation = Quaternion.AngleAxis(-a4, Vector3.forward);
text.text = string.Empty;
text.text += "C = " + C + "\r\n";
text.text += "D = " + D + "\r\n";
text.text += "E = " + E + "\r\n";
text.text += "F = " + F + "\r\n";
}
public void SceneQuit()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
Application.Quit();
}
}