2014-01-27 2 views
1

Im пытается нарисовать парабалу на диаграмме, которую я переключил на линейный граф.Рисование квадратичной кривой

 private void calculate_Click(object sender, EventArgs e) 
    { 
     double numberA = Convert.ToDouble(valueA.Text); 
     double numberB = Convert.ToDouble(valueB.Text); 
     double numberC = Convert.ToDouble(valueC.Text); 
     displayFormula(); 
     double answer1 = quadCalculator1(numberA, numberB, numberC); 
     double answer2 = quadCalcualtor2(numberA, numberB, numberC); 
     quadOutput.Text += answer1 + " OR " + answer2; 
     this.chart1.Series["quadGraph"].Points.AddXY(answer1, 0); 
     this.chart1.Series["quadGraph"].Points.AddXY(answer2, 0); 
     this.chart1.Series["quadGraph"].Points.AddXY(0, numberC); 
    } 

Однако выход является прямой линией, я беру его, мне нужно больше очков?

ответ

1

Короче говоря, да, вам нужно больше данных.

У вас есть точки, в которых график перехватывает оси x и y, а построение этих 3 - хорошее начало, но механизм построения диаграмм не имеет возможности интерпретировать, какие данные задают эти три точки (sin, cos и пилообразные графики, например, все могут быть найдены, которые включают в себя те же перехваты, что и любые квадратичные).

Если вы хотите построить приближение самой кривой, быстрое и грязное решение заключалось бы в том, чтобы отличить ответ 1 и ответ 2 (соблюдая ситуации, когда они равны или мнимы) и вычисляют y для набора точек, начиная с некоторой доли ниже самого низкого ответа и той же пропорции выше самого высокого ответа. Затем вы можете просто прокрутить результаты и добавить их по одному.

private void calculate_Click(object sender, EventArgs e) 
{ 
    double numberA = Convert.ToDouble(valueA.Text); 
    double numberB = Convert.ToDouble(valueB.Text); 
    double numberC = Convert.ToDouble(valueC.Text); 
    displayFormula(); 
    double answer1 = quadCalculator1(numberA, numberB, numberC); 
    double answer2 = quadCalcualtor2(numberA, numberB, numberC); 
    quadOutput.Text += answer1 + " OR " + answer2; 

    //this.chart1.Series["quadGraph"].Points.AddXY(answer1, 0); 
    //this.chart1.Series["quadGraph"].Points.AddXY(answer2, 0); 
    //this.chart1.Series["quadGraph"].Points.AddXY(0, numberC); 

    // Do error checking here to determine validity of answers 
    // and which is the highest and lowest of the pair 

    int count = 20; 
    double[,] data = GetPoints(numberA, numberB, numberC, answer1, answer2, count); 
    for(int i = 0; i < count; i++) 
    { 
     this.chart1.Series["quadGraph"].Points.AddXY(data[i, 0], data[i, 1]); 
    } 
} 

private double[,] GetPoints(double a, double b, double c, double xInterceptLow, double xInterceptHigh, int pointCount) 
{ 
    double[,] output = new double[pointCount,2]; 

    double subRange = xInterceptLow - xInterceptHigh; 
    double delta = (2* subRange)/pointCount; 

    double xMin = xInterceptLow - (subRange/2); 
    double xMax = xInterceptHigh + (subRange/2); 

    for(int i = 0; i < pointCount; i++) 
    { 
     double x = xMin + (i * delta); 
     double ans = GetY(a, b, c, x); 
     output[i, 0] = x; 
     output[i, 1] = ans; 
    } 
    return output; 
} 

private double GetY(double a, double b, double c, double x) 
{ 
    double answer = (a * a * x) + (b * x) + c; 
    return answer; 
} 
0

Спасибо. Я добавил цикл for, который вычисляет 20 значений для координат.

for (int i = -10; i < 10; i++) 
{ 
    double pointX = i; 
    double pointY = anyQuad(answer1, answer2, numberA, numberB, numberC, pointX); 
    this.chart1.Series["quadGraph"].Points.AddXY(pointX, pointY); 
} 

Работы красиво для всех, кто в этом нуждается!

Смежные вопросы