输入三个点坐标,生成一元二次方程

今天实现一个类,通过三个点得到一个一元二次方程。

主要实现三阶求逆,然后就可以很方便求得一元二次方程的三个系数。

求得一元二次方程解的原理很简单,推导过程如下图:

主要实现在init()函数里面,类代码如下:

//  Created by cslzy on 16/5/10.
//  Copyright © 2016年 CY. All rights reserved.
//

#include "heads.hpp"

//////////////////////////////class parabolaObject ben//////////////////////////////
class parabolaObject
{
private:
    float a = 0.0;
    float b = 0.0;
    float c = 0.0;
    bool check(); // check three initial points is ok; check initialization is ok
    bool check_is_ok = false;
public:
    parabolaObject(float , float , float );
    parabolaObject(Point2f , Point2f , Point2f );
    parabolaObject();
    void setParameters(float , float , float );
    void init(Point2f, Point2f, Point2f);
    float value(float x); // return y, where y = a*x^2 + b*x + c
    void test();
};

void parabolaObject::test()
{
    Point2f p1(0.0, 0.0);
    Point2f p2(127.5, 255.0);
    Point2f p3(255.0, 0.0);
    cout<<"--!Infor: test() function setdefault points:"<<p1<<p2<<p3<<"--"<<endl;
    init(p1, p2, p3);
}

void parabolaObject::init(Point2f p1, Point2f p2, Point2f p3)
{
//    cout<<"--Infor:input points are:"<<p1<<p2<<p3<<"--"<<endl;
    // get 3x3 matrix
    float x1 = p1.x;
    float x1_2 = x1 * x1;
    float y1 = p1.y;

    float x2 = p2.x;
    float x2_2 = x2 * x2;
    float y2 = p2.y;

    float x3 = p3.x;
    float x3_2 = x3 * x3;
    float y3 = p3.y;

    // is this matrix reversible?利用行列式来判断一下是否可逆。
    float matrix = (x1_2*x2*1 + x2_2*x3*1 + x3_2*x1*1) - (x1_2*x3*1 + x2_2*x1*1 + x3_2*x2*1);
    // test
//    cout<<"Matrix value:"<<matrix<<endl;
    if(matrix==0.0)
    {
        cout<<"--Error:input point is wrong!--"<<endl;
        exit(-1);
    }

    // get inverse
    float a11 =  (x2 - x3)/matrix;
    float a12 = -(x2_2 - x3_2)/matrix;
    float a13 =  (x2_2*x3 - x3_2*x2)/matrix;
    float a21 = -(x1 - x3)/matrix;
    float a22 =  (x1_2 - x3_2)/matrix;
    float a23 = -(x1_2*x3 - x3_2*x1)/matrix;
    float a31 =  (x1 - x2)/matrix;
    float a32 = -(x1_2 - x2_2)/matrix;
    float a33 =  (x1_2*x2 - x2_2*x1)/matrix;

//下面可以用来验证结果,在线验证网址:http://matrix.reshish.com/inverCalculation.php
//    cout<<a11<<" "<<a12<<" "<<a13<<" "<<endl;
//    cout<<a21<<" "<<a22<<" "<<a23<<" "<<endl;
//    cout<<a31<<" "<<a32<<" "<<a33<<" "<<endl;
    // get a, b, c
    a = a11*y1 + a21*y2 + a31*y3;
    b = a12*y1 + a22*y2 + a32*y3;
    c = a13*y1 + a23*y2 + a33*y3;
    cout<<"Y = "<<a<<"x^2 + "<<b<<"x + "<<c<<";"<<endl;
}

parabolaObject::parabolaObject(float x1, float x2, float x3)
{
    a = x1;
    b = x2;
    c = x3;
}

parabolaObject::parabolaObject(){};

parabolaObject::parabolaObject(Point2f p1, Point2f p2, Point2f p3)
{
    init(p1, p2, p3);
}

void parabolaObject::setParameters(float x1, float x2, float x3)
{
    a = x1;
    b = x2;
    c = x3;
}

float parabolaObject::value(float x)
{
    return a*x*x + b*x + c;
}
//////////////////////////////class parabolaObject end//////////////////////////////
void test_easyMath() // 测试函数
{
    Point2f p1(0.0, 0.0);
    Point2f p2(127.5, 255.0);
    Point2f p3(255.0, 0.0);

    parabolaObject test_parabola;
//    test_parabola.test();
    test_parabola.init(p1, p2, p3);
    float x = 200.0;
    cout<<"x = "<<x<<" y = "<<test_parabola.value(x)<<endl;
    cout<<"Input a value:";
    cin >> x;
    do{
        cout<<"x = "<<x<<" y = "<<test_parabola.value(x)<<endl;
        cout<<"Input a value:";
        cin >> x;
    }while (x!=2.0);
}

验证逆矩阵:http://matrix.reshish.com/inverCalculation.php

求逆参考:http://mathworld.wolfram.com/MatrixInverse.html

时间: 2024-10-20 16:42:22

输入三个点坐标,生成一元二次方程的相关文章

Python求一元二次方程解

题目: 请定义一个函数 'quadratic(a,b,c)',接收三个参数,返回一元二次方程: ax2 + bx + c = 0 的两个解.(提示:计算平方根可以调用math.sqrt()函数) import math def quadratic(a, b, c): if not isinstance(a, (int, float)): raise TypeError('a is not a number') if not isinstance(b, (int, float)): raise T

用java编写求出一元二次方程的解,其中a、b、c用键盘输入。

编程实例:求解一元二次方程ax^2+bx+c=0的解.其中a.b.c在键盘上输入. 1.先编写一个求根类Root. 其中包含成员变量a.b.c. 带参数的构造方法Root(int a,int b,int c) 不带参数的构造方法Root() 计算的方法void calculation() 2.编写Test11类,包含main方法. 编译并运行

20150901输入分数看看及格,一元二次方程,标准体重

输入分数看看及格,一元二次方程,标准体重 Console.Write("请输入你的姓名:"); string name = Console.ReadLine(); Console.Write("请输入你的分数:"); double fenshu = Convert.ToDouble(Console.ReadLine()); if (fenshu >= 60 && fenshu < 80) { Console.WriteLine("

39.输入任意的a,b,c求一元二次方程ax*x+bx+c=0的根?

//从这个小题中可以熟悉头文件#include<cmath>的使用 //1.题目较为简单,只需运用判断语句即可 //2.注意,声明变量时要想到根的无理性,同时需注意函数结果的强制类型转换,sqrt只支持double和float类型 #include<iostream> #include<cmath>//可以使用一些常用函数 using namespace std; int main() { int a,b,c,d; float x1,x2,x3; cout<<

求一元二次方程的根

描述 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0. 输入输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数.输出输出一行,表示方程的解.若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=....若b2 > 4 * a * c,则两个实根不等,则输出

输出成绩级别&amp;&amp;判断一元二次方程根的情况

1.输入姓名.成绩,输出级别 80-100 优秀,60-79 一般,0-59 继续努力 while (true) { Console.Write("姓名:"); Console.ReadLine(); Console.Write("成绩:"); int s = int.Parse(Console.ReadLine()); if (s >= 80 && s <= 100) { Console.WriteLine("优秀"

Openjudge-计算概论(A)-求一元二次方程的根

描述: 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2 + bx + c =0的根,其中a不等于0.输入第一行是待解方程的数目n. 其余n行每行含三个浮点数a, b, c(它们之间用空格隔开),分别表示方程ax2 + bx + c =0的系数.输出输出共有n行,每行是一个方程的根:若是两个实根,则输出:x1=...;x2 = ...若两个实根相等,则输出:x1=x2=...若是两

1-4-20:求一元二次方程的根

描述 利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0. 输入 输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数. 输出 输出一行,表示方程的解.若两个实根相等,则输出形式为:x1=x2=....若两个实根不等,则输出形式为:x1=...;x2 = ...,其中x1<x2.若

(c语法百题16)一元二次方程的实数根

知识点: 数学函数头文件 #include <math.h> 开平方函数,sqrt() 注意等号 == 与赋值号= 的区别 内容: 求一元二次方程(二次项系统不为0)ax2+bx+c=0(a≠0)的实数根 输入说明: 一行三个系数(用空格隔开) 输出说明: 先输出(-b+sqrt())/2/a的根,一行一个,如果是相等实根,则输出一个(均保留两位小数) .若无实根输出No answer! 输入样例: 1 1 2 输出样例 : No answer! 1 #include <stdio.h&