Triangulate example for iBeacons

后端 未结 13 2331
梦毁少年i
梦毁少年i 2020-11-28 17:14

I am looking into the possibility to use multiple iBeacons to do a \'rough\' indoor position location. The application is a kind of \'museum\' setting, and it would be easie

13条回答
  •  日久生厌
    2020-11-28 17:46

    I found Vishnu Prahbu's solution very useful. I ported it to c#, if anybody need it.

    public static PointF GetLocationWithCenterOfGravity(PointF a, PointF b, PointF c, float dA, float dB, float dC)
        {
            //http://stackoverflow.com/questions/20332856/triangulate-example-for-ibeacons
            var METERS_IN_COORDINATE_UNITS_RATIO = 1.0f;
    
            //http://stackoverflow.com/a/524770/663941
            //Find Center of Gravity
            var cogX = (a.X + b.X + c.X) / 3;
            var cogY = (a.Y + b.Y + c.Y) / 3;
            var cog = new PointF(cogX,cogY);
    
            //Nearest Beacon
            PointF nearestBeacon;
            float shortestDistanceInMeters;
            if (dA < dB && dA < dC)
            {
                nearestBeacon = a;
                shortestDistanceInMeters = dA;
            }
            else if (dB < dC)
            {
                nearestBeacon = b;
                shortestDistanceInMeters = dB;
            }
            else
            {
                nearestBeacon = c;
                shortestDistanceInMeters = dC;
            }
    
            //http://www.mathplanet.com/education/algebra-2/conic-sections/distance-between-two-points-and-the-midpoint
            //Distance between nearest beacon and COG
            var distanceToCog =  (float)(Math.Sqrt(Math.Pow(cog.X - nearestBeacon.X, 2)
                    + Math.Pow(cog.Y - nearestBeacon.Y, 2)));
    
            //Convert shortest distance in meters into coordinates units.
            var shortestDistanceInCoordinationUnits = shortestDistanceInMeters * METERS_IN_COORDINATE_UNITS_RATIO;
    
            //http://math.stackexchange.com/questions/46527/coordinates-of-point-on-a-line-defined-by-two-other-points-with-a-known-distance?rq=1
            //On the line between Nearest Beacon and COG find shortestDistance point apart from Nearest Beacon
            var t = shortestDistanceInCoordinationUnits / distanceToCog;
            var pointsDiff = new PointF(cog.X - nearestBeacon.X, cog.Y - nearestBeacon.Y);
            var tTimesDiff = new PointF(pointsDiff.X * t, pointsDiff.Y * t);
    
            //Add t times diff with nearestBeacon to find coordinates at a distance from nearest beacon in line to COG.
            var userLocation = new PointF(nearestBeacon.X + tTimesDiff.X, nearestBeacon.Y + tTimesDiff.Y);
    
            return userLocation;
        }
    

提交回复
热议问题