以防遗忘001_通过斜率求垂直线段的端点,附Unity(UI image)画线

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();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值