Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Помогите написать функцию


Автор: DoZENT 9.7.2007, 19:14
Помогите пожалуйста! Необходимо определить уравнение параболы по трем точкам. Может есть готовая процедура?

Автор: Throne 9.7.2007, 20:32
я считаю, что такое лучше спрашивать у твоего преподавателя математики.
если у тебя есть математическое решение этой задачи, то программу написать не сложно.

Автор: DoZENT 9.7.2007, 21:21
Цитата(Throne @  9.7.2007,  20:32 Найти цитируемый пост)
если у тебя есть математическое решение этой задачи, то программу написать не сложно.

Все дело в том, что нет этого решения((

Автор: Throne 9.7.2007, 21:54
три точки даются в виде F(x1)=n1, F(x2)=n2, F(x2)=n2, где x1,2,3 - произвольные или идущие строго по порядку?

Автор: DoZENT 9.7.2007, 22:05
Throne, координаты точкек задаются произвольно (использую random и рисую их в PaintBox).

Автор: SPrograMMer 9.7.2007, 22:10
Ну давай вспоминать чего тама за уравнение этой самой параболы...прально... квадратное уравнение с тремя коэффициентами... вот... у тебя три точки с координатами x и y... подсталяй их три раза вместо x и y  в уравнение и вычисляй неизвестные тебе коэффициенты... всего-то система из трех ЛИНЕЙНЫХ уравнений с тремя неизвестными...  smile  smile 

осталось токо сотворить решение этой самой системы... ну тут уж дело так сказать... плёвое... рисуем се на бумажке такую систему в общем виде и решаем  smile 

Автор: Throne 9.7.2007, 22:23
Цитата(DoZENT @ 9.7.2007,  22:05)
Throne, координаты точкек задаются произвольно (использую random и рисую их в PaintBox).

не ты не понял что я спрашиваю. у нас данные задачи какие? 
при х1=(число) у1=(число)
при х2=(число) у2=(число)
при х3=(число) у3=(число)
Так?
или просто:
у2=(число)
у2=(число)
у2=(число)

Автор: DoZENT 9.7.2007, 22:33
SPrograMMer, да, плевое... Мозги уже совсем не варят, а проект сдавать завтра (можно сказать почти сегодня). 

Throne, данные задачи: Компьютер случайным образом задает координаты 3 точек. Провести через них параболу и треугольник, рассчитать площади образованных фигур. Ну построю-то я сам, мне самое главное функцию этой параболы найти. В интернете нашел такое решение: 
Код

Procedure Parabola(A, B, C : TPoint; Var KoefA, KoefB, KoefC : integer);
Var M : Array[1..2, 1..3] Of Extended;
    D, Da, Db : Extended;
Begin
 M[1, 1] := Sqr(A.X) - Sqr(B.X);
 M[1, 2] := A.X - B.X;
 M[1, 3] := A.Y - B.Y;

 M[2, 1] := Sqr(B.X) - Sqr(C.X);
 M[2, 2] := B.X - C.X;
 M[2, 3] := B.Y - C.Y;
 
 D := M[1, 1] * M[2, 2] - M[1, 2] * M[2, 1];

 If D <> 0 Then
  Begin
   Da := M[1, 3] * M[2, 2] - M[2, 3] * M[1, 2];
   Db := M[1, 1] * M[2, 3] - M[1, 2] * M[1, 3];
   KoefA := trunc (Da / D);
   KoefB := trunc (Db / D);
   KoefC := A.Y - KoefA * Sqr(A.X) - KoefB * A.X;
  End
  Else
  Begin
   KoefA := 0; KoefB := 0; KoefC := 0;
  End;
End;

но оно почему-то не работает(( (делаю так):

Код


  TPointsPosition = record

    Point1 : TPoint;
    Point2 : TPoint;
    Point3 : TPoint;

  end;

...

procedure DrawParabola (PP : TPointsPosition);
var
a,b,c : integer;
i,k : integer;
x : extended;
y : integer;
j : integer;
part : integer;
x1,y1 : integer;
begin

  Part := 14;

  // Уравнение параболы y = ax2 + bx + c

  with MainForm do
  begin


    //Parabola (PP.Point1, PP.Point2, PP.Point3, a,b,c);

 
    if a = 0 then
    begin
      Memo.Lines.Add ('При текущем расположении точек парабола не существует');
      Exit;
    end;
    
    Memo.Lines.Add ('Коэффициенты параболы:');
    Memo.Lines.Add ('A: ' + IntToStr (A));
    Memo.Lines.Add ('B: ' + IntToStr (B));
    Memo.Lines.Add ('C: ' + IntToStr (C));



     Box.Canvas.MoveTo(1, -25);

      J := -14;
      for i := -25 to 25 do
      begin

        //y := a* (i*i) + b*i + c;


        Memo.Lines.Add (IntToStr (GetNormalXCoordinate (J)) + ':  ' + IntToStr (y));

        J := J + Part;
        Canvas.LineTo (J, (-1)*y + Box.Height);
        //Memo.Lines.Add ('J= ' + IntToStr (J) + ':  ' + IntToStr ((-1)*y + Box.Height) + ' (' + IntToStr (y) + ')');

      end;


  end;

end;

Коэффициент A почему-то всегда оказывается равен нулю((

Автор: Throne 9.7.2007, 22:54
ща напишу решение. ток поем. и кино досмотрю. короче к часу увидишь.

Автор: DoZENT 9.7.2007, 22:57
Throne, спасибо тебе огромное заранее, с меню много-много плюсов smile 

Автор: DoZENT 10.7.2007, 01:12
Throne, ну спасибо((( smile

Автор: Nite 10.7.2007, 10:17
DoZENT, все просто.

У тебя есть три точки (x1,y1) (x2,y2) (x3,y3)
Также есть парабола y=a*x^2+b*x+c
Получаешь систему из трех линейных уравнений
a*x1^2+b*x1+c=y1
a*x2^2+b*x2+c=y2
a*х3^2+b*х3+c=y3

Решаешь ее относительно неизвестных a, b и c. Можно через матрицы, можно методом Гаусса. Или ты это тоже не умеешь?

Автор: Throne 10.7.2007, 12:15
Цитата

a*x1^2+b*x1+c=y1
a*x2^2+b*x2+c=y2
a*х3^2+b*х3+c=y3


Сначала находим D:
D = x1^2 * x2 + x2^2 * x3 + x3^2 * x1 - ( x3^2 * x2 + x2^2 * x1 + x1^2 * x3)

Затем находим Da, Db и Dc:
Da = y1 * x2 + y2 * x3 + y3 * x1 - (y3 *x2 + y2 * x1 + y1 * x3)

Db = x1^2 * y2 + x^2 * y3 + x3^2 * y1 - ( x3^2 * y2 + x2^2 * y1 + x1^2 * y3)

Dc = x1^2 * x2 * y3 + x2^2 * x3 * y1+ x3^2 * x1 * y2 - ( x3^2 * x2 * y1 + x2^2 * x1 * y3 + x1^2 * x3 * y2)

Ну и в конце находим соответственно a, b и c:
a=Da/D
b=Db/D
c=Dc/D

Автор: DoZENT 10.7.2007, 21:52
Nite, то что ты написал я знал, мне нужно было вычисление коэффициентов a,b,c из этого уравнения.

В любом случае всем большое спасибо, все сдал на 5 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)