二维数据点运算基础

1 两点之间的运算

已知两点P1(x1,y1), P2(x2,y2)

1.1 两点直线的直线斜率:K=\frac{y2-y1}{x2-x1} ,B=y2-K*x2

double K = (y2-y1)/(x2-x1);

double B = y2-K*x2;

1.2 两点之间的距离:D=\sqrt{(y2-y1)^2 +(x2-x1)^2 }

double D = sqrt((pow((y2 - y1), 2)) + (pow((x2 -x1), 2)));

2 三点之间的运算

已知三点P1(x1,y1), P2(x2,y2), P3(x3,y3),P1和P2确定一条直线,斜率是K,截距是B

2.1 点P3到直线(P2→P1)的距离:Dl=\frac{|K*x3+B-y3|}{\sqrt{1+K^2 } }

double Dl = (fabs(K*x3 + B - y3))/sqrt(1 + K*K);

2.2 三点组成一个圆弧,计算圆弧半径和原点

cv::Point2d defineCircle(cv::Point2d P1, cv::Point2d P2, cv::Point2d P3, double &radius)

{

    double x1 = P1.x,  x2 = P2.x,  x3 = P3.x;

    double y1 = P1.y,  y2 = P2.y,  y3 = P3.y;

    double a = x1 - x2;

    double b = y1 - y2;

    double c = x1 - x3;

    double d = y1 - y3;

    double e = ((x1 * x1 - x2 * x2) + (y1 * y1 - y2 * y2)) / 2.0;

    double f = ((x1 * x1 - x3 * x3) + (y1 * y1 - y3 * y3)) / 2.0;

    double det = b * c - a * d;

    if( fabs(det) < 1e-5)

    {

        radius = -1;

        return cv::Point2d(0,0);

    }

    double x0 = -(d * e - b * f) / det;

    double y0 = -(a * f - c * e) / det;

    radius = hypot(x1 - x0, y1 - y0);

    return cv::Point2d(x0, y0);

}

2.3 求夹角

//=====================================================

// 函数功能: 计算两个向量之间的夹角( P1→P2, P2→P3)

//=====================================================

double Cal_Angle(cv::Point2d P1, cv::Point2d P2, cv::Point2d P3)

{

    double Mod1 = sqrt(pow(P1.x - P2.x, 2) + pow(P1.y - P2.y, 2));

    double Mod2 = sqrt(pow(P2.x - P3.x, 2) + pow(P2.y - P3.y, 2));

    double dot = (P2.x - P1.x)*(P3.x - P2.x) + (P2.y - P1.y)*(P3.y - P2.y);

    return acos(dot / (Mod1*Mod2))*180.0 / 3.14159;

}

3 四点之间的运算

已知三点P1(x1,y1), P2(x2,y2), P3(x3,y3), P4(x4,y4) 

3.1 P1和P2确定一条直线,P3和P4确定一条直线,求两条直线之间的交点坐标

cv::Point2d Cal_InterPoint_TwoLine(cv::Point2d P1, cv::Point2d P2, cv::Point2d P3, cv::Point2d P4)

{

    double a1, a2, a3, b1, b2, b3, t;

    cv::Point2d pp1;

    a1 = P4.y - P3.y;

    a2 = P3.y - P1.y;

    a3 = P2.y - P1.y;

    b1 = P4.x - P3.x;

    b2 = P3.x - P1.x;

    b3 = P2.x - P1.x;

    t = (a3 * b2 - a2 * b3) / (a1 * b3 - a3 * b1);

    pp1.x = (P4.x - P3.x) * t + P3.x;

    pp1.y = (P4.y - P3.y) * t + P3.y;

    return pp1;

}

3.2 求两条直线之间的夹角

double cal_LineAngle(double K1, double B1, double K2, double B2) 

{

    double T = fabs(K2-K1)/(1+fabs(K2*K1));  //弧度

     return atan(T) * 180 / 3.14159; 

}

4 最小二乘法拟合直线方程

//========================================================= // 函数功能: 最小二乘法拟合直线方程//=========================================================void FitLine(vector<cv::Point2d> InData, double &k, double &b, double &R2)

{

    int n = InData.size();

    if(n < 2) { R2 = -1; return; }

    double sumX = 0, sumY = 0, s_xy = 0, s_xx = 0;

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

    {

        sumX += InData.at(i).x;

        sumY += InData.at(i).y;

        s_xy += InData.at(i).x * InData.at(i).y;

        s_xx += InData.at(i).x * InData.at(i).x;

    }

    double _x = sumX/n;

    double _y = sumY/n;

    k = (n*s_xy - sumX*sumY)/(n*s_xx - sumX*sumX);

    b = (s_xx*sumY-sumX*s_xy)/(n*s_xx - sumX*sumX);

    //计算R平方

    double tempSumXX = 0, tempSumYY = 0, E = 0;

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

    {

        tempSumXX += (InData.at(i).x - sumX/n)*(InData.at(i).x - sumX/n);

        tempSumYY += (InData.at(i).y - sumY/n)*(InData.at(i).y - sumY/n);

        E += (InData.at(i).x - sumX/n)*(InData.at(i).y - sumY/n);

    }

    double R = E/(sqrt(tempSumXX)*sqrt(tempSumYY));

    R2 = R*R;

}

5 一阶低通数字滤波器

cv::Point2d lowPassFilter(cv::Point2d currentVal, cv::Point2d prevFilteredVal)

{

    double ALPHA = 0.5;

    cv::Point2d filteredVal;

    filteredVal.x = ALPHA * currentVal.x + (1 - ALPHA) * prevFilteredVal.x;

    filteredVal.y = ALPHA * currentVal.y + (1 - ALPHA) * prevFilteredVal.y;

    return filteredVal;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容