精华内容
下载资源
问答
  • 圆弧上的点坐标计算

    千次阅读 2019-11-29 10:06:51
    坐标公式求圆或圆弧上点的坐标角度用弧度制表示 求圆或圆弧上点的坐标 X=Rcos(θ) Y=Rsin(θ) 角度用弧度制表示 θ 是用弧度制表示的角度 角度转幅度公式 弧度=(角度*π)/180 R是半径 ...

    求圆或圆弧上点的坐标

    X=Rcos(θ)
    Y=R
    sin(θ)

    角度用弧度制表示

    θ 是用弧度制表示的角度
    角度转幅度公式 弧度=(角度*π)/180
    R是半径

    展开全文
  • 前些天朋友让我帮忙做一个功能“根据图上的点获取相应的颜色”,点是可拖动的,并且是以圆的...解决方案,自定义view继承ImageView,以中心点坐标和手指坐标计算夹角,以夹角计算点的位置。@Override protected void...

    前些天朋友让我帮忙做一个功能“根据图上的点获取相应的颜色”,点是可拖动的,并且是以圆的形式做规律运动的,以前也没做过,所以想了很多方法都没实现,最后参考了别人的以角度算位置才算解决了。

    先说说需求

    在内圆或外圆中有个点,可以拖动,点一直在两条线的中间位置。





    解决方案,自定义view继承ImageView,以中心点坐标和手指坐标计算夹角,以夹角计算点的位置。

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {//获得初始效果
        super.onLayout(changed, left, top, right, bottom);
    //获取中心点坐标
        centerX = getWidth()/2;
        centerY = getHeight()/2;
    //获取半径
        r = (getWidth()/2)-((getWidth()/2)/((ceng+1)*2)+30);
    //初始化手指坐标点
        X = centerX-50;
        Y = centerY+500;
    //通过手指坐标点和中心点获取初始点的位置
        dianY = (int) (r + (r) * Math.cos(Math.PI * (getRotationBetweenLines(centerX,centerY,X,Y)) / 180));
        dianY = (int) (r + (r) * Math.sin(Math.PI * (getRotationBetweenLines(centerX,centerY,X,Y)) / 180));
    //修改手指初始点的位置
        X = dianY;
        Y = dianY;
    //设置拖动监听
        setOnTouchListener(this);
    }
    /**
     *获取两条线的夹角   本方法为往上拷贝的方法,验证可以使用
     * @param centerX
     * @param centerY
     * @param xInView
     * @param yInView
     * @return
     */
    public static int getRotationBetweenLines(float centerX, float centerY, float xInView, float yInView) {
        double rotation = 0;
    
        double k1 = (double) (centerY - centerY) / (centerX * 2 - centerX);
        double k2 = (double) (yInView - centerY) / (xInView - centerX);
        double tmpDegree = Math.atan((Math.abs(k1 - k2)) / (1 + k1 * k2)) / Math.PI * 180;
    
        if (xInView > centerX && yInView < centerY) {  //第一象限
            rotation = 90 - tmpDegree;
        } else if (xInView > centerX && yInView > centerY) //第二象限
        {
            rotation = 90 + tmpDegree;
        } else if (xInView < centerX && yInView > centerY) { //第三象限
            rotation = 270 - tmpDegree;
        } else if (xInView < centerX && yInView < centerY) { //第四象限
            rotation = 270 + tmpDegree;
        } else if (xInView == centerX && yInView < centerY) {
            rotation = 0;
        } else if (xInView == centerX && yInView > centerY) {
            rotation = 180;
        }
    
        return (int) rotation;
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getActionMasked()){
            case MotionEvent.ACTION_DOWN://获取手指按下坐标并根据坐标和点的位置判断本次操作是否有效
                if (event.getX()<dianX-100||event.getX()>dianX+100||event.getY()<dianY-100||event.getY()>dianY+100){//判断本次拖动是否有效
                    t=true;
                    break;
                }
                X = (int)event.getX();
                Y = (int)event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                if (t){
                    break;
                }
                X = (int)event.getX();
                Y = (int)event.getY();
                if (ceng == 2){//因为图可能会有两层颜色所以才加了这个判断,进入内圈修改半径就可以了
                    if (X>getWidth()/4&&X<getWidth()-(getWidth()/4)&&Y>getWidth()/4&&Y<getWidth()-(getWidth()/4)){
                        r = (getWidth()/2)-((getWidth()/2)/((ceng+1))+30+(getWidth()/2)/((ceng+1)*2));
                    }else {
                        r = (getWidth()/2)-((getWidth()/2)/((ceng+1)*2)+30);
                    }
                }
                invalidate();//刷新view实现拖动效果,刷新时主要是调用了view的onDraw方法
                break;
            case MotionEvent.ACTION_UP:
                t=false;
                break;
        }
        return true;
    }

    上面代码为页面初始数据设置
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    //获取夹角度数
        int dushu = getRotationBetweenLines(centerX,centerY,X,Y)-90;
    //根据夹角获取点的坐标
        dianX = (int) (centerX + (r) * Math.cos(Math.PI * dushu / 180));
        dianY = (int) (centerY + (r) * Math.sin(Math.PI * dushu / 180));
        Paint paint = new Paint();
        paint.setAntiAlias(false);
        paint.setColor(Color.RED);
    //将点画在view上
        canvas.drawCircle( dianX, dianY, 10, paint);
        //获取颜色可以写在这里,把接口的方法改一下或者加一个方法就好了
        if (rotation != null){//这是接口方便做下一步操作
            rotation.Rotation(dushu);
        }
    }
    本文中主要代码为getRotationBetweenLines内的代码获取到了夹角的度数。

    展开全文
  • 六边形格子地图坐标计算与转换

    千次阅读 2017-04-12 13:29:16
    // 世界场景的一些数据管理,如提供坐标转换之类的接口 var WorldMapManager = function () { this.mapSize = null; // 地图大小,像素 this.curViewPos = null; // 当前大地图视野坐标 // 初始化世界地图的...
    // 世界场景的一些数据管理,如提供坐标转换之类的接口
    
    var WorldMapManager = function () {
        this.mapSize = null;     // 地图大小,像素
        this.curViewPos = null;  // 当前大地图视野坐标
    
        // 初始化世界地图的数据
        this.init = function (mapSize, tileSize) {
            this.mapSize = {
                    width  : globalConsts.WorldMapSize.width * globalConsts.TileSize.width + globalConsts.TileSize.width / 2,
                    height : globalConsts.WorldMapSize.height * ((globalConsts.TileSize.height - globalConsts.TileSize.hex) / 2 + globalConsts.TileSize.hex) + 
                                (globalConsts.TileSize.height - globalConsts.TileSize.hex) / 2
                };
            this.tileSize = globalConsts.TileSize;
        };
    
        // 大地图坐标转成蜂窝cell
        this.mapPosToTile = function (pos) {
            // 算出缩放成正六边形后边长 a 的值
            var a = this.tileSize.width / Math.sqrt(3);
            var x = pos.x, y = (this.mapSize.height - pos.y) / this.tileSize.height * a * 2 + a / 2;    // 加 a / 2 是因为矩形网格计算时会在底部增加 a / 2
            
            //位于矩形网格边线上的三个CELL中心点
            var points = new Array(cc.p(0, 0), cc.p(0, 0), cc.p(0, 0));
            //当前距离的平方
            var dist;
            //      index:被捕获的索引
            var i, index;
            //二分之根号3 边长的平方,如果距离比它还小,就必然捕获
            var g_MinDistance2 = Math.pow(a * Math.sqrt(3) / 2, 2);
            // 网格宽、高
            var g_unitx = a * Math.sqrt(3);     //sqrt(3) * a
            var g_unity = a * 1.5;              //a * 3 / 2
            // 网格对角线平方向上取整
            var mindist= Math.ceil(Math.pow(g_unitx, 2) + Math.pow(g_unity, 2));
            //计算出鼠标点位于哪一个矩形网格中
            var cx = parseInt(x/g_unitx);
            var cy = parseInt(y/g_unity);
    
            points[0].x = parseInt(g_unitx * cx);
            points[1].x = parseInt(g_unitx * (cx+0.5));
            points[2].x = parseInt(g_unitx * (cx+1));
            //根据cy是否是偶数,决定三个点的纵坐标
            if(cy % 2 == 0)
            {
                //偶数时,三个点组成倒立三角
                points[0].y = points[2].y = parseInt(g_unity * cy);
                points[1].y = parseInt(g_unity * (cy+1));
            }    
            else
            {
                //奇数时,三个点组成正立三角
                points[0].y = points[2].y = parseInt(g_unity * (cy+1));
                points[1].y = parseInt(g_unity * cy);
            }
            
            // 计算两点间距离的平方
            function distance2(x1, y1, x2, y2)
            {
                return ((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
            }
    
            //现在找出鼠标距离哪一个点最近
            for(i = 0; i < 3; ++i)
            {
                //求出距离的平方
                dist = distance2(x, y, points[i].x, points[i].y);
    
                //如果已经肯定被捕获
                if(dist < g_MinDistance2)
                {
                    index = i;
                    break;
                }
    
                //更新最小距离值和索引
                if(dist < mindist)
                {
                    mindist = dist;
                    index = i;
                }
            }
            
            // x 第 0 个点的列值减 1 等于cell.x ( x 最左半格有 -1 值 )
            // cy 偶数时中间点 + 1,奇数时两边点 + 1,减 1 是因为初始为了计算方便 y 补了 a / 2 ( y 最上半格 也会存在 -1 )
            return {x : cx - (index > 0? 0 : 1), y : cy + (cy % 2 + index % 2) % 2 - 1};
        };
        
        // 格子坐标转成地图坐标
        this.tilePosToMap = function (pos) {
            var tileCenter, xPixel, yPixel;
    
            tileCenter = (pos.x * this.tileSize.width) + this.tileSize.width / 2;
            xPixel = tileCenter + (pos.y % 2) * this.tileSize.width / 2;
            yPixel = this.tileSize.height / 2 + pos.y * (this.tileSize.height / 2 + this.tileSize.hex / 2);
    
            // 因为锚点的关系,y值需要倒过来,这很重要
            yPixel = this.mapSize.height - yPixel;
    
            return cc.p(xPixel, yPixel);
        };
        
        // 获取相邻两个六边形格子中心点距离
        this.getAdjacentHexagonCenterPointDistance = function (isLeftAndRight) {
            if (isLeftAndRight) {
                return this.tileSize.width;
            } else {
                return Math.sqrt(Math.pow((this.tileSize.height + this.tileSize.hex) / 2, 2) + Math.pow(this.tileSize.width / 2, 2));
            }
        };
    };
    
    // 单例
    
    WorldMapManager.sharedInstance = null;
    
    WorldMapManager.getInstance = function(){
        if (WorldMapManager.sharedInstance == null) {
            WorldMapManager.sharedInstance = new WorldMapManager();
            WorldMapManager.sharedInstance.init();
        }
        return WorldMapManager.sharedInstance;
    };


    var tileCalculate = {
    
        // 两六边形 tilePos 获取 无视阻挡的最短距离格子数 0~1 return 1
        getTwoTileDistance : function(lightTilePos, findTilePos) {
            var offX = 1, offY = 1;   // 初始 findTilePos 在 lightTilePos 左上,往右下寻
            var tilePos, count;
    
            if (lightTilePos.y === findTilePos.y) {
                return Math.abs(lightTilePos.x - findTilePos.x);
            } else if (lightTilePos.x === findTilePos.x) {
                return Math.abs(lightTilePos.y - findTilePos.y);
            } else {
                count = 0;
                tilePos = {x:findTilePos.x, y:findTilePos.y};
                // 在右,往左寻
                if (lightTilePos.x < tilePos.x) {
                    offX = -1;
                }
                // 在下,往上寻
                if (lightTilePos.y < tilePos.y) {
                    offY = -1;
                }
                do {
                    ++count;
                    tilePos.x += tilePos.y % 2 > 0 ? (offX > 0 ? offX : 0) : (offX < 0 ? offX : 0);
                    tilePos.y += offY;
                } while (lightTilePos.x !== tilePos.x && lightTilePos.y !== tilePos.y);
                count += Math.abs(lightTilePos.x - tilePos.x) + Math.abs(lightTilePos.y - tilePos.y);
                return count;
            }
        },
    
        // 获取格子周围一圈,共六个格子的格子坐标
        getAroundTilePos : function(tilePos) {
            if (tilePos.y % 2 > 0) {
                return [{x : tilePos.x, y : tilePos.y - 1}, {x : tilePos.x, y : tilePos.y + 1}, // 上下
                        {x : tilePos.x - 1, y : tilePos.y}, {x : tilePos.x + 1, y : tilePos.y}, // 左右
                        {x : tilePos.x + 1, y : tilePos.y - 1}, {x : tilePos.x + 1, y : tilePos.y + 1}];    // 右上,右下
            } else {
                return [{x : tilePos.x, y : tilePos.y - 1}, {x : tilePos.x, y : tilePos.y + 1}, // 上下
                        {x : tilePos.x - 1, y : tilePos.y}, {x : tilePos.x + 1, y : tilePos.y}, // 左右
                        {x : tilePos.x - 1, y : tilePos.y - 1}, {x : tilePos.x - 1, y : tilePos.y + 1}];    // 左上,左下
            }
        },
    
        // 获取格子周围两圈,共十八个格子的格子坐标
        getAroundTwoLapsTilePos : function(tilePos) {
            var i, j, tiles1, tiles2 = [];
            var tilePoses = {};
    
            // 把第一圈及第一圈每一个的第一圈都收集起来
            tiles1 = this.getAroundTilePos(tilePos);
            for (i in tiles1) {
                tiles2 = this.getAroundTilePos(tiles1[i]);
                for (j in tiles2) {
                    if (tiles2[j].x !== tilePos.x || tiles2[j].y !== tilePos.y) {
                        tilePoses[JSON.stringify(tiles2[j])] = tiles2[j];
                    }
                }
            }
    
            return tilePoses;
        },
    
    };


    展开全文
  • 追其原因是,ios7是全屏幕坐标系统,导航栏自己就由一个 self . navigationController . view, self . navigationController . view的frame是(0,20,568,44);而self.view 的frame为(0,64,560,320-64)因此如果想将...

    今天项目开发过程中,碰到了要将一个UIActivityIndicatorView放到屏幕中间,最开始的如下:

        m_activityIndicator.frame = CGRectMake(([UIScreen mainScreen].bounds.size.height -40)/2,([UIScreen mainScreen].bounds.size.width -40 )/2,40,40);

        [self.view addSubview:m_activityIndicator];

    屏幕是横向的,发现,垂直方向不在中间,而是向下偏移了。追其原因是,ios7是全屏幕坐标系统,导航栏自己就由一个self.navigationController.view,self.navigationController.view的frame是(0,20,568,44);而self.view 的frame为(0,64,560,320-64)因此如果想将视图添加到self.view正中间的话,需要减去64.代码如下:

      m_activityIndicator.frame = CGRectMake(([UIScreen mainScreen].bounds.size.height -40)/2,([UIScreen mainScreen].bounds.size.width -40 - 64)/2,40,40);

        [self.view addSubview:m_activityIndicator];

    而如果是想将视图加到手机屏幕的中间的话,不用减去64,直接加到self.navigationcontroller.view中代码如下:

      m_activityIndicator.frame = CGRectMake(([UIScreen mainScreen].bounds.size.height -40)/2,([UIScreen mainScreen].bounds.size.width -40)/2,40,40);

        [self.navigationcontroller.view addSubview:m_activityIndicator];



    展开全文
  • var pointArr = [new BMap.Point(106.607421,29.570857),new BMap.Point(106.620931,29.586185)]; function getcenterpoiont(){ var lng1 = parseFloat(pointArr[0].lng); var lat1 = parseFloat(pointArr[0].la....
  • 以往网上给出了计算方法,但是double类型的数后面有很多位小数,现在给出一个函数,其值跟百度地图APP软件的距离一样 public String getLatLngDistance(LatLng start, LatLng end){  //自己实现距离算法:  /** ...
  • Unity 求两 Vector3 的中间坐标

    千次阅读 2019-02-22 11:46:45
    using System.Collections; using System.Collections.Generic; using UnityEngine; public class BetweenPoint : MonoBehaviour { public Transform pos1; public Transform pos2;... public Transf...
  • 大地坐标高斯/UTM投影计算工具

    万次阅读 2018-05-21 13:00:51
    今天要跟大家分享的是一个坐标投影计算小工具,提供北京54、西安80、WGS84和CGCS2000坐标系进行高斯投影和UTM投影正反算转换计算(平面坐标与大地坐标相互转换),提供地理坐标度分秒格式与十进制度度格式的相互转换...
  • C# 获得当前鼠标的屏幕中间坐标(c#)

    千次阅读 2008-10-03 12:20:00
    Point p = new Point(Screen.PrimaryScreen.WorkingArea.Width / 2, Screen.PrimaryScreen.WorkingArea.Height / 2); Cursor.Position = p; (测试成功)或者 Cursor.Position = new Point(Screen.PrimaryScreen....
  • public class BaiDuMap {  static double DEF_PI = 3.14159265359; // PI  static double DEF_2PI= 6.28318530712; // 2*PI  static double DEF_PI180= 0.01745329252; // PI/180.0 ...
  • 计算曲线与坐标轴的面积

    千次阅读 2018-10-15 15:53:00
    根据坐标点,计算曲线与坐标轴的面积。 import numpy as np import matplotlib.pyplot as plt x = np.arange(0,1,0.001) y = np.sqrt(1-x**2) plt.close('all') plt.plot(x, y) plt.show() 1. trapz...
  • Android 计算多边形中心点坐标

    千次阅读 2018-09-21 11:32:11
    最近在做室内二维图,用到了一个功能计算出不规则图形的中心点,在这里记录一下集合代码而已: /** * 获取不规则多边形重心点 * * @param mPoints * @return */ public static PointF getCenterOfGravityPoint...
  • 把各个点向量加起来,除以点的个数。
  • AS3 坐标系中的一些简单计算

    千次阅读 2011-08-26 15:08:13
    AS3 在坐标系中操作时,通常有一些常用的计算函数,比如求线的角度、两点间的距离、两点的中点、某个点是否在我选中的区域中等等 下面是一些常用函数,我在做程序时自己写的。     /** *获取两点间的中间...
  • 经纬度坐标与瓦片坐标、像素坐标的相互转换,以平面坐标中间量进行转换。 吐槽 百度地图JavaScript的代码非常奇葩,非常迷惑: 经纬度类是 Point ,平面坐标类是 Pixel 。 经纬度转平面坐标是 lngLatToPoint...
  • 三阶贝塞尔曲线公式计算坐标

    千次阅读 2017-08-03 17:43:12
    //point1,point2曲线中间点 四个点顺序上到下,p3,p2,p1,p0 BesselEvaluator besselEvaluator = new BesselEvaluator(point1, point2); //point0, point3,这两个参数最终会传到BesselEvaluator中的evaluate...
  • 假设有两个vector3点start,end,以及中间点M.z; 求点M?   M = Vector3.Lerp (start,end,(M.z-end.z)/(start.z-end.z)); 解析:前面两个参数放的要求出其两者间的某个点,第三个参数是比例,根据这个...
  • 计算两点之间点的位置坐标

    千次阅读 2019-08-07 12:41:31
    案例:已知两点坐标a(x1,y1) b... 计算s1,s2,s3……的位置坐标。 ① a->b 向量表示为(x2- x1,y2 - y1) ②计算ab两点间距离L = (x2-x1)² +(y2 - y1)² 再开方 ③s1.x = x1 + (x2 - x1)/L * m *1 s1...
  • //进行经纬度转换为距离的计算 function Rad(d){ return d * Math.PI / 180.0;//经纬度转换成三角函数中度分表形式。 } /* 计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度 默认单位km */ ...
  • 随着人造卫星和互联网的发展,我们很容易就能通过卫星或基站信号获取个人设备在地球上所在的坐标,在利用姿态传感器,获取自身的航向角便可实时矫正自身航向往目的方向前进。而自动导航在人工智能领域的主要应用就是...
  • * 计算两地之间的距离(给定经纬度) * * @param lat1 出发地经度 * @param lng1 出发地纬度 * @param lat2 目的地经度 * @param lng2 目的地纬度 * @return double 两点之间的距离 */ private double ...
  • android之位置坐标

    万次阅读 2014-12-11 17:38:58
    当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。 view.scrollTo (x,y)  将整个 父视图的左上角定为(0,0),再移动这个 屏幕 的左上角到父视图...
  • OpenGl 坐标转换

    千次阅读 2016-01-15 16:22:45
    举个例子说明,比如上个阶段中得到了一个顶点的坐标为(0,0,0.5,1),根据这个坐标,该顶点位于投影平面的正中间。如果将该点映射到大小为50*50的窗口上时,那么它应该位于屏幕的中间坐标为(25,25, 0.5,1)。当然这里...
  • 四至点坐标,即左上经、左上纬、右下经、右下纬(在地理坐标系下,计算的是经纬度,否则是6位数的那种投影坐标)
  • 笛卡尔坐标

    万次阅读 2018-04-16 23:07:27
    由于本人也在不断学习中,如有错误,欢迎指正,谢谢! 笛卡尔坐标主要有: 1D :就是我们在初中时候学过的叫数轴,用单个...三维坐标系分为左手坐标系和右手坐标系 多坐标系 如下图的绘制,根据不同的坐标...
  • 假设point的类型为点,road的类型为线。 求某一线段的整个长度用...假设某一point就在某一road的起点与终点之间且挨着该road,现在想计算该point到该road的起点、终点的长度,若直接用road的起点、终点的坐标和sing...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,614
精华内容 32,245
关键字:

中间站坐标计算