精华内容
下载资源
问答
  • 树的双亲表示、树的左孩子右兄弟表示、孩子表示 1. 树和森林的双亲表示, 2. 树的左孩子右兄弟表示 3. 创建树的左孩子右兄弟二叉树 4. 二叉树到树的双亲表示转换思路和算法

    主题:

    1. 树和森林的双亲表示法,
    2. 树的左孩子右兄弟表示法
    3. 创建树的左孩子右兄弟二叉树
    4. 二叉树到树的双亲表示法的转换思路和算法

    后续文章:

    【数据结构】代码实现:左孩子右兄弟表示法转换为树的双亲表示法,左孩子右兄弟表示法转化为树的孩子兄弟链表表示法,树的双亲表示法转化为左孩子右兄弟的二叉树表示法

    树和森林生成二叉树算法:

    在这里插入图片描述

    数据结构定义:

    在这里插入图片描述
    在这里插入图片描述

    输入:

    1
    2
    5
    -1
    6
    -1
    -1
    3
    -1
    4
    7
    -1
    8
    -1
    9
    10
    -1
    -1
    -1
    -1
    -1
    

    函数代码:

    Trees.h

    #include <iostream>
    #define MAX_SIZE 50
    #include <stack>
    #include <queue>
    typedef struct ForestNode
    {
        int data;
        struct ForestNode *lchild, *rbrother;
    } ForestNode, *ForestHead;
    
    /***
     * 树的前序遍历建立森林
     */
    ForestHead CreateForestHead(ForestHead fr, bool isRoot)
    {
        if (isRoot)
            std::cout << "请输入第一棵树根节点,-1标识空:";
        int data;
        fr = (ForestNode *)malloc(sizeof(ForestNode));
        std::cin >> data;
        fr->lchild = NULL;
        fr->rbrother = NULL;
        fr->data = data;
        if (data != -1)
        {
            bool isRoot = false;
            std::cout << "请输入" << data << "的首个孩子:";
            fr->lchild = CreateForestHead(fr->lchild, isRoot);
            std::cout << "请输入" << data << "的相邻兄弟:";
            fr->rbrother = CreateForestHead(fr->rbrother, isRoot);
        }
        return fr;
    }
    
    /***
     * 双亲表示法
     */
    typedef struct TreeNode
    {
        int valid = 0;  //该节点是否存储了父节点信息,如果没有,那么只是跳转指针,存储的是兄弟信息
        int parent = 0; //-1表示无父节点,其他表示指向的父节点
    } TreeNode;
    
    typedef struct Forest
    {
        TreeNode f[MAX_SIZE];
    } Forest; //森林的数列定义
    
    /***
     * 将左孩子,右兄弟的存储方式的树,转化为双亲表示法
     */
    void TransChildBrother2PrentArray(ForestHead fr, Forest *farray)
    {
        if (fr)
        {
            TransChildBrother2PrentArray(fr->lchild, farray);
            if (fr->data != -1)
            {
                //std::cout << fr->data << "\t左孩子:" << fr->lchild->data << "\t右兄弟: " << fr->rbrother->data << std::endl;
                if (fr->rbrother->data != -1) //有了兄弟,记录类型为指针,指向第一个兄弟,
                {
                    farray->f[fr->rbrother->data].valid = 0;
                    farray->f[fr->rbrother->data].parent = fr->data;
                }
                if (fr->lchild->data != -1) //有了孩子,记录类型为真实值,孩子的parent置为父亲值
                {
                    farray->f[fr->lchild->data].valid = 1;
                    farray->f[fr->lchild->data].parent = fr->data;
                }
            }
            TransChildBrother2PrentArray(fr->rbrother, farray);
        }
    }
    
    /***
     * 把树链表转换为双亲表示法
     * 
     * 如果树有左孩子,那么左孩子的父节点就是双亲节点
     * 如果树有右孩子,那么说明树的父节点也是右孩子父节点
     * 最好用中序遍历二叉树,这样会先遍历全部的孩子节点
     * 
     * 中序遍历:5 6 2 3 7 8 10 9 4 1
     * 
     */
    void GetParentArrayTreeList(ForestHead fr, Forest *farray, int nodeNum)
    {
        TransChildBrother2PrentArray(fr, farray); //将左孩子,右兄弟的存储方式的树,转化为双亲表示法
        std::cout<<"将左孩子,右兄弟的存储方式的树,转化为双亲表示法:\n";
        for (int i = 1; i <= nodeNum; i++)
        {
            if (farray->f[i].valid != 0 && farray->f[i].valid != 1) //进行迭代,如果是树的根节点,有效位和双亲标志-1
            {
                farray->f[i].valid = -1;
                farray->f[i].parent = -1;
            }
            while (farray->f[i].valid == 0) //当有效位为0时,根据兄弟节点,去查找父亲节点值,直到找到为止。
            {
                if (farray->f[farray->f[i].parent].valid == 1)
                    farray->f[i].valid = 1;
                farray->f[i].parent = farray->f[farray->f[i].parent].parent;
            }
            std::cout << "数据" << i << "指向:\t" << farray->f[i].parent << "\t是否指向父节点: " << farray->f[i].valid << std::endl;
        }
    }
    
    
    

    调用代码

    Trees_use.cpp

    #include"Trees.h"
    
    int main()
    {
       ForestHead tr = NULL;
        tr = CreateForestHead(tr, true); // 根据左孩子,右节点的规则创建树;
        Forest *farray = (Forest *)malloc(sizeof(Forest));
        GetParentArrayTreeList(tr, farray,10);//转化上面的树为 孩子双亲表示法
    }
    

    左孩子右节点转化为孩子双亲表示法思路:

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    最后得到结果,符合树的结构:
    在这里插入图片描述

    展开全文
  • 文中将LC曲线用于解决系数矩阵病态问题,介绍了该算法的基本思想、转换思路,同时将拟准检定用于抵抗公共点坐标存在的粗差问题。算例研究表明,LC曲线与拟准检定能够分别克服公路控制测量坐标转换中病态矩阵及...
  • 10进制转16进制,以及10进制转2进制,还有10进制转8进制,这些转换如果按照常规思路的话,会灰常的麻烦。我们来看一下 10进制转16进制:假如这里有一个十进制数字:35,我们的需求就是把这个35转成16进制的。思路:...

    10进制转16进制,以及10进制转2进制,还有10进制转8进制,这些转换如果按照常规思路的话,会灰常的麻烦。

    我们来看一下 10进制转16进制:

    假如这里有一个十进制数字:35,我们的需求就是把这个35转成16进制的。

    思路:先把35转换成二进制,然后二进制再转换16进制。

    9f06285cbc5e9bc628cc851aca212d20.png

    代码:

    class SearchTable

    {

    public static void main(String[] args)

    {

    String[] s = searchTable(35,3,7);

    /**

    *

    *for(int i = 0; i< arr.length ; i++)

    *{

    *

    *System.out.println(arr[i]);

    *

    *}

    */

    for(int i = 0; i<8 ; i++)

    {

    System.out.print(s[i]);

    }

    }

    public static String[] searchTable(int num,int offset,int mask)

    {

    String[] table = {"","1","2","3","4","5","6","7","8","9","a","b","c","d","e"};

    String[] output = new String[8];

    int [] arrtemp = new int[8];

    for(int i = arrtemp.length-1 ; i>=0 ; i--){

    arrtemp[i] = num&mask;

    num = num>>>offset;

    output[i] =table[arrtemp[i]];

    }

    return output;

    }

    }

    温馨提示,当写程序的时候尽量保证一个量变化否则,会把自己绕进去的。

    /**

    *反面示例

    */

    class SearchTable

    {

    public static void main(String[] args)

    {

    String s = searchTable(35,3,7);

    /**

    *

    *for(int i = 0; i< arr.length ; i++)

    *{

    *

    *System.out.println(arr[i]);

    *

    *}

    */

    System.out.print(s);

    }

    public static String searchTable(int num,int offset,int mask)

    {

    String[] table = {"","1","2","3","4","5","6","7","8","9","a","b","c","d","e"};

    String output = "";

    int [] arrtemp = new int[8];

    for(int i =0 ; i

    arrtemp[i] = num&mask;

    num = num>>>offset;

    System.out.println("---"+i+"--");

    System.out.println(arrtemp[7-i]);

    System.out.println(table[arrtemp[i]]);

    System.out.println("---"+i+"--end");

    output += table[arrtemp[i]];

    }

    return output;

    }

    }

    展开全文
  • 最近有很多笔试算法题,碰到了一道很陌生的:波兰表示和逆波兰表示转换,用java代码实现了一下,题解给的实例跑通了,不知道其他的怎么样。 题干如下: 思路 从后向前遍历输入的字符数组 根据题干中前波的...

    笔试题算法实现

    最近有很多笔试算法题,碰到了一道很陌生的:波兰表示法和逆波兰表示法的转换,用java代码实现了一下,题解给的实例跑通了,不知道其他的怎么样。
    题干如下:题干描述

    思路

    • 从后向前遍历输入的字符数组
    • 根据题干中前波的表示方法入栈
    • 输出前波的结果,与给出示例表达式对比
    • *将正确的前波拆分入栈
    • 规则为遇到右括号出栈四项值,分别为:左括号,表达式左值,表达式,表达式右值
    • 按后波的规则拼接,并入栈
    • 最后栈中的就是结果

    java代码如下

    ####  **写的仓促变量定义有点乱**
    import java.util.ArrayList;
    import java.util.Stack;
    
    
    public class Main {
        public static void main(String[] args) {
            String str="-,+,a,*,+,b,c,d,e";
            String[] strs=str.split(",");
            Stack<String> stac=new Stack<String>();
            
            ArrayList<String> al=new ArrayList<String>();
            al.add("+");al.add("-");al.add("*");al.add("/");// 存放标点值
            
            int i=strs.length-1;
            while(i>=0){
                
                if(!al.contains(strs[i])){
                    stac.push(strs[i]);
                }else{
                        String one=stac.pop();
                        String two=stac.pop();
                        String tem="("+one+strs[i]+two+")"; // 全部添加括号保证 下边运算的正确顺序
                        stac.push(tem);
                }
                i--;
            }
            
            Stack<String> sta1=new Stack<String>();
            String[] re=stac.pop().split("");
            int j=0;
            while(j<re.length){
                if(!re[j].equals(")")){
                    sta1.push(re[j]);
                }else{
                    String one=sta1.pop();
                    String two=sta1.pop();
                    String three=sta1.pop();
                    String four=sta1.pop();//  仅仅是将左括号 去除掉
                    String tem=""+three+one+two;
                    sta1.push(tem);
                }
                j++;
            }
            System.out.println(sta1.pop());
        }
    }
    

    可直接运行,通过题解中示例,不知道其他的对不对

    另外,由于代码中输入已写死,所以没有考虑边界不符合情况

    可顶可踩可留言!

    转载于:https://www.cnblogs.com/CHWYH/p/5845689.html

    展开全文
  • 小地图的制作网上其实有很多教程,最常见的就是MiniMap使用正交摄像机Render Texture制作,这种摄像机会实时在上空更新地图。但是使用摄像机无疑是耗费资源的,有时候需要的小功能其实只是需要标识自己...主要思路:根.

    小地图的制作网上其实有很多教程,最常见的就是MiniMap使用正交摄像机Render Texture制作,这种摄像机会实时在上空更新地图。但是使用摄像机无疑是耗费资源的,有时候需要的小功能其实只是需要标识自己所在的位置,这时候使用一张地形俯视图就完全可以达到我们的要求。

      首先我们需要一张地形正上方的俯视图一张作为小地图的背景。然后一个图片标识表示自己的位置。效果如下

    然后我们需要将地形添加两个点,左下和右上两个点来获得地形的大小,同时注意将Canvas画布的位置与地形对齐

    主要思路:根据地形的两点获得地形的尺寸,然后根据地图图片尺寸和地形尺寸的比例转换坐标,获得标识点与自身位置的对齐。

     

    主要代码:

    
     
    1. /// <summary>

    2. /// 世界坐标转地图坐标

    3. /// </summary>

    4. /// <param name="point"></param>

    5. /// <returns></returns>

    6. public Vector2 WorldPositionToMap(Vector3 point)

    7. {

    8. var pos = point - Corner1.position; //得到当前位置相对于地形起始角的位置

    9. //小地图在右上角的起始位置

    10. var MapStart = new Vector2(Screen.width - mapRect.rect.width, (Screen.height - mapRect.rect.height-TopHeight));

    11.  
    12. var mapPos = new Vector2(

    13. MapStart.x+(point.x / terrainSize.x * mapRect.rect.width),

    14. MapStart.y+(point.z / terrainSize.y * mapRect.rect.height)); //缩放到能适配地图尺寸的点

    15. return mapPos;

    16.  
    17. }

    18. /// <summary>

    19. /// 地图坐标转世界坐标

    20. /// </summary>

    21. /// <param name="point">屏幕坐标</param>

    22. /// <returns></returns>

    23. public Vector3 MapToWorld(Vector2 point)

    24. {

    25. var MapStart = new Vector2(Screen.width - mapRect.rect.width, (Screen.height - mapRect.rect.height));

    26. var pos = point - MapStart;

    27. var Posx = Corner1.position.x+(pos.x / mapRect.rect.width * terrainSize.x);

    28. var Posz = Corner1.position.z + (pos.y / mapRect.rect.height * terrainSize.y);

    29. var WorldMap = new Vector3(Posx, Camera.main.transform.position.y, Posz);

    30. return WorldMap;

    31. }

    参考链接:https://blog.csdn.net/zjw1349547081/article/details/53517021

    TopHeight是我项目里自定义的上边距,因为上面有一层背景所以需要减去。terrainSize是地形尺寸,mapRect是地图图片在初始化中实例化。

    
     
    1. // Use this for initialization

    2. void Start ()

    3. {

    4. mapRect = GetComponent<RectTransform>();

    5. terrainSize = new Vector2(Corner2.position.x - Corner1.position.x,

    6. Corner2.position.z - Corner1.position.z);

    7. MaxHeight = mapRect.rect.height * 2;

    8. MaxWidth = mapRect.rect.width * 2;

    9. Num = NavImg.rect.width/mapRect.rect.width;

    10.  
    11. TopHeight = Top.rect.height;

    12. }

    MaxHeight和MaxWidth是最大高度和最大宽度,是我后面为了限制小地图无限拉伸做的限制。

    接下来我们只要实时更新标识与自身的位置就可以了。

    
     
    1. // Update is called once per frame

    2. void Update ()

    3. {

    4.  
    5. SizePictures();

    6. //掉地图指针位置更新

    7. NavImg.position=WorldPositionToMap(Camera.main.transform.position);

    8. NavImg.sizeDelta = new Vector2(mapImg.sizeDelta.x*Num, mapImg.sizeDelta.x * Num);

    9.  
    10. }

    我这里更新的是摄像机的位置,如果想要人物之类绑定的话可自行修改。SizePictures是后面我们要说的自定义拖拽地图大小的方法,因为拖拽可能往左或者往右,所以为了不让标识图片大小变形,我这里让标识图片以宽度为准伸缩大小。

    既然小地图标识绑定了,我们是不是该做个点击小地图,移动的摄像机视角的功能呢。

    
     
    1. /// <summary>

    2. /// 点击小地图主摄像机移动

    3. /// </summary>

    4. public void MapClick1()

    5. {

    6. Vector2 point = Input.mousePosition;

    7. Camera.main.transform.position = MapToWorld(point);

    8.  
    9. }

    给小地图添加点击事件,将该方法绑定

    好了,小地图基本做好了,我们来试试自定义大小的功能,这个功能我做的不是很好,拖拽的时候总觉得挺费劲的,如果以后找到更好的方式再做修改。

    
     
    1. /// <summary>

    2. /// 小地图拖拽改变大小

    3. /// </summary>

    4. public void SizePictures()

    5. {

    6. // 当按住鼠标左键的时候

    7. if (Input.GetMouseButton(0)&&IsDrawing())

    8. {

    9. float h = Screen.width - Input.mousePosition.x - mapRect.sizeDelta.x;

    10. float v = Screen.height - Input.mousePosition.y - mapRect.sizeDelta.y;

    11.  
    12.  
    13. //小地图大小位置重置

    14. mapRect.sizeDelta = new Vector2(mapRect.sizeDelta.x+h, mapRect.sizeDelta.y+v);

    15. mapRect.anchoredPosition = new Vector2(0-mapRect.rect.width/2,0-(mapRect.rect.height/2)-TopHeight);

    16.  
    17. mapImg.sizeDelta = new Vector2(mapImg.sizeDelta.x + h, mapImg.sizeDelta.y + v);

    18. mapImg.anchoredPosition = new Vector2(0,0);

    19.  
    20. }

    21. }

    22. /// <summary>

    23. /// 判定是否可以拖拽小地图

    24. /// </summary>

    25. /// <returns></returns>

    26. public bool IsDrawing()

    27. {

    28. bool Isdraw = false;

    29. //边缘检测

    30. //左,左下,下,三种情况可拖拽

    31. //左

    32. if (Input.mousePosition.x < (mapRect.transform.position.x - mapRect.rect.width / 2.0f + m_validityWidth))

    33. {

    34. Isdraw = true;

    35. if (Input.mousePosition.x < (mapRect.transform.position.x - MaxWidth / 2)|| Input.mousePosition.y < (mapRect.transform.position.y - MaxHeight / 2))

    36. {

    37. Isdraw = false;

    38. }

    39. }

    40. //如果鼠标位置离下侧边界的限定距离内

    41. else if ((Input.mousePosition.y < (mapRect.transform.position.y - mapRect.rect.height / 2.0f + m_validityWidth)))

    42. {

    43. Isdraw = true;

    44. if (Input.mousePosition.y < (mapRect.transform.position.y - MaxHeight / 2)|| Input.mousePosition.x < (mapRect.transform.position.x - MaxWidth / 2))

    45. {

    46. Isdraw = false;

    47. }

    48.  
    49. }

    50. else

    51. {

    52. Isdraw = false;

    53. }

    54.  
    55.  
    56. return Isdraw;

    57. }

    判断鼠标是否在小地图的边缘处可进行拖拽,我这里小地图是在右上方所以只判定往左,左下,下方三种情况拖拽的可能性。

     

    using UnityEngine;
    using System.Collections;
    using System.Diagnostics;
    using UnityEngine.EventSystems;
    using Debug = UnityEngine.Debug;
     
    //图片仿视频窗口缩放类
    public class Test : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
    {
        [Header("有效检测的边缘宽度")]
        public float m_validityWidth = 10f;
     
        //存储操作的拖拽方向(默认为无操作)
        private DragDirection m_direction = DragDirection.None;
     
        //1.上方  //5.左上角
        //2.下方  //6.左下角
        //3.左方  //7.右上角
        //4.右方  //8.右下角
     
        //存储当前操作图片位置
        private Vector3 tTargetPos;
        //存储鼠标位置
        private Vector3 tMousePos;
        //存储当前图片宽度
        private float tWidth;
        //存储当前图片高度
        private float tHeight;
     
        //存储不动点位置坐标
        //解释一下:当我们拖动每个边界时至少有一个点时应该不动的,我们就以该点为基准点,当拖动单面有两点不动时我们取两点的中间点为基准点
        private Vector3 m_basePoint;
     
        /// <summary>
        /// 拖拽时刷新数据
        /// </summary>
        /// <param name="eventData"></param>
        void DoRefresh(PointerEventData eventData)
        {
            //刷新鼠标位置
            tMousePos = eventData.position;
            //刷新图片位置
            tTargetPos = transform.position;
            //刷新图片宽度
            tWidth = GetComponent<RectTransform>().sizeDelta.x;
            //刷新图片高度
            tHeight = GetComponent<RectTransform>().sizeDelta.y;
        }
     
        //拖动开始触发
        public void OnBeginDrag(PointerEventData eventData)
        {
            //刷新数据方法
             DoRefresh(eventData);
     
        }
        //拖动进行中触发
        public void OnDrag(PointerEventData eventData)
        {
            //刷新数据方法
            DoRefresh(eventData);
     
            #region 判定拖动方向
            //如果鼠标位置离左侧边界的限定距离内,设置对应的方向
            if (tMousePos.x < (tTargetPos.x - tWidth / 2.0f + m_validityWidth))
            {
                m_direction = DragDirection.Left;
                //上
                if (tMousePos.y > (tTargetPos.y + tHeight / 2.0f - m_validityWidth))
                {
                    m_direction = DragDirection.LeftUp;
                }
                //下
                else if ((tMousePos.y < (tTargetPos.y - tHeight / 2.0f + m_validityWidth)))
                {
                    m_direction = DragDirection.LeftDown;
                }
     
            }
            //如果鼠标位置离右侧边界的限定距离内
            else if (tMousePos.x > (tTargetPos.x + tWidth / 2.0f - m_validityWidth))
            {
                m_direction = DragDirection.Right;
                //上
                if (tMousePos.y > (tTargetPos.y + tHeight / 2.0f - m_validityWidth))
                {
                    m_direction = DragDirection.RightUp;
                }
                //下
                else if ((tMousePos.y < (tTargetPos.y - tHeight / 2.0f + m_validityWidth)))
                {
                    m_direction = DragDirection.RightDown;
                }
            }
            //如果鼠标位置离上侧边界的限定距离内
            else if (tMousePos.y > (tTargetPos.y + tHeight / 2.0f - m_validityWidth))
            {
                m_direction = DragDirection.Up;
                //左
                if (tMousePos.x < (tTargetPos.x - tWidth / 2.0f + m_validityWidth))
                {
                    m_direction = DragDirection.LeftUp;
                }
                //右
                else if (tMousePos.x > (tTargetPos.x + tWidth / 2.0f - m_validityWidth))
                {
                    m_direction = DragDirection.RightUp;
                }
            }
            //如果鼠标位置离下侧边界的限定距离内
            else if ((tMousePos.y < (tTargetPos.y - tHeight / 2.0f + m_validityWidth)))
            {
                m_direction = DragDirection.Down;
                //左
                if (tMousePos.x < (tTargetPos.x - tWidth / 2.0f + m_validityWidth))
                {
                    m_direction = DragDirection.LeftDown;
                }
                //右
                else if (tMousePos.x > (tTargetPos.x + tWidth / 2.0f - m_validityWidth))
                {
                    m_direction = DragDirection.RightDown;
                }
            }
            else
            {
                m_direction = DragDirection.None;
            }
     
     
            #endregion
     
            //根据当前判定的方向做出相应的仿视频窗口缩放
            switch (m_direction)
            {
                case DragDirection.Left:
                    DoLeft();
                    break;
                case DragDirection.Right:
                    DoRight();
                    break;
                case DragDirection.Up:
                    DoUp();
                    break;
                case DragDirection.Down:
                    DoDown();
                    break;
                case DragDirection.LeftUp:
                    DoLeftUp();
                    break;
                case DragDirection.LeftDown:
                    DoLeftDown();
                    break;
                case DragDirection.RightUp:
                    DoRightUp();
                    break;
                case DragDirection.RightDown:
                    DoRightDown();
                    break;
                default:
                   // Debug.Assert(false);
                    break;
            }
     
        }
     
        #region 各个方向对应的调整方法
        /// <summary>
        /// 左拖动改变图片横向大小
        /// </summary>
        void DoLeft()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos + new Vector3(tWidth / 2.0f, 0, 0);
            //设定图片宽度
            float ttWidth = Mathf.Abs(m_basePoint.x - tMousePos.x);
            GetComponent<RectTransform>().sizeDelta = new Vector2(ttWidth, tHeight);
            //设置图片位置
            transform.position = m_basePoint - new Vector3(ttWidth / 2.0f, 0, 0);
        }
        /// <summary>
        /// 右拖动改变图片横向大小
        /// </summary>
        void DoRight()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos - new Vector3(tWidth / 2.0f, 0, 0);
            //设定图片宽度
            float ttWidth = Mathf.Abs(m_basePoint.x - tMousePos.x);
            GetComponent<RectTransform>().sizeDelta = new Vector2(ttWidth, tHeight);
            //设置图片位置
            transform.position = m_basePoint + new Vector3(ttWidth / 2.0f, 0, 0);
        }
        /// <summary>
        /// 上拖动改变图片横向大小
        /// </summary>
        void DoUp()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos - new Vector3(0, tHeight / 2.0f, 0);
            //设定图片高度
            float ttHeight = Mathf.Abs(m_basePoint.y - tMousePos.y);
            GetComponent<RectTransform>().sizeDelta = new Vector2(tWidth, ttHeight);
            //设置图片位置
            transform.position = m_basePoint + new Vector3(0, ttHeight / 2.0f, 0);
        }
        /// <summary>
        /// 下拖动改变图片横向大小
        /// </summary>
        void DoDown()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos + new Vector3(0, tHeight / 2.0f, 0);
            //设定图片高度
            float ttHeight = Mathf.Abs(m_basePoint.y - tMousePos.y);
            GetComponent<RectTransform>().sizeDelta = new Vector2(tWidth, ttHeight);
            //设置图片位置
            transform.position = m_basePoint - new Vector3(0, ttHeight / 2.0f, 0);
        }
        /// <summary>
        /// 左上拖动改变图片横向大小
        /// </summary>
        void DoLeftUp()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos + new Vector3(tWidth / 2.0f, -tHeight / 2.0f, 0);
            //设定图片宽度
            float ttWidth = Mathf.Abs(m_basePoint.x - tMousePos.x);
            //设定图片高度
            float ttHeight = Mathf.Abs(m_basePoint.y - tMousePos.y);
            GetComponent<RectTransform>().sizeDelta = new Vector2(ttWidth, ttHeight);
            //设置图片位置
            transform.position = m_basePoint + new Vector3(-ttWidth / 2.0f, ttHeight / 2.0f, 0);
        }
        /// <summary>
        /// 左下拖动改变图片横向大小
        /// </summary>
        void DoLeftDown()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos + new Vector3(tWidth / 2.0f, tHeight / 2.0f, 0);
            //设定图片宽度
            float ttWidth = Mathf.Abs(m_basePoint.x - tMousePos.x);
            //设定图片高度
            float ttHeight = Mathf.Abs(m_basePoint.y - tMousePos.y);
            GetComponent<RectTransform>().sizeDelta = new Vector2(ttWidth, ttHeight);
            //设置图片位置
            transform.position = m_basePoint + new Vector3(-ttWidth / 2.0f, -ttHeight / 2.0f, 0);
        }
        /// <summary>
        /// 右上拖动改变图片横向大小
        /// </summary>
        void DoRightUp()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos + new Vector3(-tWidth / 2.0f, -tHeight / 2.0f, 0);
            //设定图片宽度
            float ttWidth = Mathf.Abs(m_basePoint.x - tMousePos.x);
            //设定图片高度
            float ttHeight = Mathf.Abs(m_basePoint.y - tMousePos.y);
            GetComponent<RectTransform>().sizeDelta = new Vector2(ttWidth, ttHeight);
            //设置图片位置
            transform.position = m_basePoint + new Vector3(ttWidth / 2.0f, ttHeight / 2.0f, 0);
        }
        /// <summary>
        /// 右下拖动改变图片横向大小
        /// </summary>
        void DoRightDown()
        {
            //设定基准点坐标
            m_basePoint = tTargetPos + new Vector3(-tWidth / 2.0f, tHeight / 2.0f, 0);
            //设定图片宽度
            float ttWidth = Mathf.Abs(m_basePoint.x - tMousePos.x);
            //设定图片高度
            float ttHeight = Mathf.Abs(m_basePoint.y - tMousePos.y);
            GetComponent<RectTransform>().sizeDelta = new Vector2(ttWidth, ttHeight);
            //设置图片位置
            transform.position = m_basePoint + new Vector3(ttWidth / 2.0f, -ttHeight / 2.0f, 0);
        }
        #endregion
     
        //拖动结束触发
        public void OnEndDrag(PointerEventData eventData)
        {
            //重置拖动方向
            m_direction = DragDirection.None;
        }
     
    }
     
    /// <summary>
    /// 拖拽方向枚举
    /// </summary>
    public enum DragDirection
    {
        None,       //无
        Up,         //上
        Down,       //下
        Left,       //左
        Right,      //右
        LeftUp,     //左上
        RightUp,    //右上
        LeftDown,   //左下
        RightDown   //右下
    }

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
     
    public class MapControl : MonoBehaviour {
        //小地图图片
        public RectTransform NavImg;
        //地形的左下和右上两个点
        public Transform Corner1, Corner2;
        //上界面
        public RectTransform Top;
        //上界面的高度
        private float TopHeight;
        //地形的大小
        private Vector2 terrainSize;
        //获取当前地图背景的位置
        private RectTransform mapRect;
        //获取当前地图的位置
        public RectTransform mapImg;
     
        [Header("拖拽速度")]
        public float MoveSpeed;
     
        [Header("有效检测的边缘宽度")]
        public float m_validityWidth = 10f;
     
        //最大宽度
        private float MaxWidth;
        //最大高度
        private float MaxHeight;
        //倍数
        private float Num;
        
     
        // Use this for initialization
        void Start ()
        {
            mapRect = GetComponent<RectTransform>();
            terrainSize = new Vector2(Corner2.position.x - Corner1.position.x,
                Corner2.position.z - Corner1.position.z);
            MaxHeight = mapRect.rect.height * 2;
            MaxWidth = mapRect.rect.width * 2;
            Num =  NavImg.rect.width/mapRect.rect.width;
     
            TopHeight = Top.rect.height;
        }
        /// <summary>
        /// 世界坐标转地图坐标
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public Vector2 WorldPositionToMap(Vector3 point)
        {
            var pos = point - Corner1.position;    //得到当前位置相对于地形起始角的位置
            //小地图在右上角的起始位置
            var MapStart = new Vector2(Screen.width - mapRect.rect.width, (Screen.height - mapRect.rect.height-TopHeight));
     
            var mapPos = new Vector2(
                MapStart.x+(point.x / terrainSize.x * mapRect.rect.width),
                MapStart.y+(point.z / terrainSize.y * mapRect.rect.height));   //缩放到能适配地图尺寸的点
            return mapPos;
     
        }
        /// <summary>
        /// 地图坐标转世界坐标
        /// </summary>
        /// <param name="point">屏幕坐标</param>
        /// <returns></returns>
        public Vector3 MapToWorld(Vector2 point)
        {  
            var MapStart = new Vector2(Screen.width - mapRect.rect.width, (Screen.height - mapRect.rect.height));
            var pos = point - MapStart;
            var Posx = Corner1.position.x+(pos.x / mapRect.rect.width * terrainSize.x);
            var Posz = Corner1.position.z + (pos.y / mapRect.rect.height * terrainSize.y);
            var WorldMap = new Vector3(Posx, Camera.main.transform.position.y, Posz);
            return WorldMap;
        }
     
        /// <summary>
        /// 点击小地图主摄像机移动
        /// </summary>
        public void MapClick1()
        {
            Vector2 point = Input.mousePosition;
            Camera.main.transform.position = MapToWorld(point);
     
        }
     
        // Update is called once per frame
        void Update ()
        {
            
            SizePictures();
            //掉地图指针位置更新
            NavImg.position=WorldPositionToMap(Camera.main.transform.position);
            NavImg.sizeDelta = new Vector2(mapImg.sizeDelta.x*Num, mapImg.sizeDelta.x * Num);
     
        }
     
      /// <summary>
      /// 小地图拖拽改变大小
      /// </summary>
        public void SizePictures()
        {
            // 当按住鼠标左键的时候  
            if (Input.GetMouseButton(0)&&IsDrawing())
            {
                float h = Screen.width - Input.mousePosition.x - mapRect.sizeDelta.x;
                float v = Screen.height - Input.mousePosition.y - mapRect.sizeDelta.y;
     
     
                //小地图大小位置重置
                mapRect.sizeDelta = new Vector2(mapRect.sizeDelta.x+h, mapRect.sizeDelta.y+v);
                mapRect.anchoredPosition = new Vector2(0-mapRect.rect.width/2,0-(mapRect.rect.height/2)-TopHeight);
     
                mapImg.sizeDelta = new Vector2(mapImg.sizeDelta.x + h, mapImg.sizeDelta.y + v);
                mapImg.anchoredPosition = new Vector2(0,0);
     
            }
        }
        /// <summary>
        /// 判定是否可以拖拽小地图
        /// </summary>
        /// <returns></returns>
        public bool IsDrawing()
        {
            bool Isdraw = false;
            //边缘检测
            //左,左下,下,三种情况可拖拽
            //左
            if (Input.mousePosition.x < (mapRect.transform.position.x - mapRect.rect.width / 2.0f + m_validityWidth))
            {
                Isdraw = true;
                if (Input.mousePosition.x < (mapRect.transform.position.x - MaxWidth / 2)|| Input.mousePosition.y < (mapRect.transform.position.y - MaxHeight / 2))
                {
                    Isdraw = false;
                }
            }
            //如果鼠标位置离下侧边界的限定距离内
            else if ((Input.mousePosition.y < (mapRect.transform.position.y - mapRect.rect.height / 2.0f + m_validityWidth)))
            {
                Isdraw = true;
                if (Input.mousePosition.y < (mapRect.transform.position.y - MaxHeight / 2)|| Input.mousePosition.x < (mapRect.transform.position.x - MaxWidth / 2))
                {
                    Isdraw = false;
                }
               
            }
            else
            {
                Isdraw = false;
            }
     
     
            return Isdraw;
        }
     
    }

    https://blog.csdn.net/qq_30300405/article/details/88660207

     

     

     

    展开全文
  • 查表的用法: ​​​​​​  当元素过多,并呈现一定数组和元素之间有着对应的关系,再... 十六进制转换思路:  假设设置一个数字为int num = 60;在计算机中的二进制则表示:0000-0000 0000-0000 0000-0...
  • 一、概念介绍 1.1、匈牙利命名:user_id,字母均小写,不同单词间用下划线分割; 1.2、驼峰命名:userId,除了第一个...如何将匈牙利命名法转换成驼峰命名? 三、思路 这里有好几种方法,这里介绍一种...
  • 2. 实现思路 AI==>.svg==>base64 2.1 先用AI绘制好AI图 2.2 导出SVG格式文档 注意,导出之前先把画板固定下来 “对象-画板-适和选中的图稿” 2.3 在线转换base64 2.4 复制到CSS中应用——以stylus语法为...
  • 10进制转16进制,以及10进制转2进制,还有10进制转8进制,这些转换如果按照常规思路的话,会灰常的麻烦。 我们来看一下 10进制转16进制: 假如这里有一个十进制数字:35,我们的需求就是把这个35转成16进制的。 ...
  • 代码一的进制转换用了一个非常繁琐的方法,除进制转换,所以在第二个代码用了求余进制转换。 回文数,for循环搜索一半判断即可。 代码一 #include <bits/stdc++.h> using namespace std; int main() { int...
  • 笔试题算法实现最近有很多笔试算法题,碰到了一道很陌生的:波兰表示和逆波兰表示转换,用java代码实现了一下,题解给的实例跑通了,不知道其他的怎么样。 题干如下:思路 从后向前遍历输入的字符数组 根据题...
  • 思路: 模拟短除: 带入下面的代码,分析此方法。 111 //10进制初始值 num:055 ans:1 i:1 num:027 ans:11 num:013 ans:111 num:006 ans:1111 i:2 num:003 ans:11110 num:001 ans:111101 num:000 ans:1111011 i:3 ...
  • 算术表达式有前缀表示、中缀表示和后缀表示等形式。日常使用的算术表达式是采用中缀表示,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。 输入格式说明:
  • java科学计数法转换为数字型字符串

    千次阅读 2019-06-28 17:01:46
    思路:用将字符串转为BigDecimal类型的实体,然后根据里面的方法,就可以转为数字型的字符串了 可直接参考此篇文章:<java科学计数法转换为数字型字符串> ...
  • 一、概念介绍1.1、匈牙利命名:user_id,字母均小写,不同单词间用下划线分割;...二、问题如何将匈牙利命名法转换成驼峰命名?三、思路这里有好几种方法,这里介绍一种:1.首先我们要获取匈牙利命名的 ...
  • /* 控制台输入十进制数,及需转换到的进制,一般是二进制、八进制、 ... 思路: 输入的int 计算机会转换为32位二进制数计算 例如: 输入60 计算机: 0000-0000 0000-0000 0000-0000 0011-1100
  • 该业务数据最大转换到T(单位可扩张,第一种实现思路的限制在BigDecimal能支持的大小,第二种实现限制在语言本身或者说没有限制)为单位 思路: 逢1024进一个单位(借鉴进制思想,这里可以随意设置,只是我的代码...
  • 【数据结构X.5】树、森林的双亲表示,左孩子右兄弟表示,创建树的左孩子右兄弟二叉树以及二叉树到树的双亲表示转换思路和算法 本文主题: 可执行代码和代码示例在最后。 【左孩子右兄弟】表示法转换为树的...
  • 两个思路,都是把字符串转换为其他数字,完后进行数字的运算,素数的运算,或者我们熟知的打点,或者是hash算法。 问题代码来源: http://blog.csdn.net/v_JULY_v // algorithm_sub_string.cpp : ...
  • 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。 输入描述: 多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数) 输出描述: 每行输出...
  • 集合里,青铜段位的选手一般的思路是先分割,再遍历。 But, 白银选手都是用 Stream(真的好用) 过程如下: String 亚索 = "4,4,3"; String[] 风男数组 = yasuo.split(","); List<Integer> 风男集合 = Arrays....
  • 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。  首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。  然后从左到右扫描数组元素值的“10”...
  • 最近干活的时候遇到了从驼峰命名的样式转换为css版本的短线命名,记录一下这里用到的算法。 问题描述 讲给定的字符串中以大写字母做分隔的字符串变为以短线分隔,非大写字母均认为是小写字母 。 思路 思路: 1. ...
  • 用递归将一个整数n转换成字符串(C语言) 题目要求:如标题。例如,输入481,应输出字符串“483”。n的位数不确定,可以是任意位数的整数。 思路: 设定函数function(int n),令i=n%10,j=n/10 如果j>0,则...
  • 题目描述 将M进制的数X转换为N进制的数输出。 ...思路:一般的思路是将m进制的数转换成10进制,再将其转换成n进制。但是这样的话代码量就比较大了,而且还容易混乱,所以在这里不进行先转10再转n,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 863
精华内容 345
关键字:

思路转换法