Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2012, 20:41   #1
Determinant666
 
Регистрация: 02.03.2011
Сообщений: 7
Вопрос Рисование треугольника по заданной длине стороны и двум углам

Доброе время суток! Есть задание нарисовать треугольник на канве в Delphi по заданной длине одной из сторон и двум углам прилегающим к ней, есть код программы которая рисует и преобразовывает треугольник по заданному углу и трем сторонам, фактически рисует равносторонний треугольник, вроде похожее, но не могу разобраться в коде, пожалуйста, кто может, скажите как правильно переписать код для моего случая, заранее спасибо!
Код той программы, что у меня есть:
Код:
unit PIK_Lab_Geometr_12_1_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Grids;

type
  TF_Lab_1 = class(TForm)
    B_Shape_Drow: TButton;
    Image_S: TImage;
    B_Exit: TButton;
    L_Shape_Xc: TLabel;
    Edit1: TEdit;
    L_Shape_Yc: TLabel;
    Edit2: TEdit;
    lblL_Rotate_2: TLabel;
    Edit3: TEdit;
    lblL_Rotate_3: TLabel;
    Edit4: TEdit;
    Bevel1: TBevel;
    Shape1: TShape;
    lblL_Shape_Center: TLabel;
    lblL_Shift_x2: TLabel;
    Edit5: TEdit;
    lblL_Shift_x3: TLabel;
    edt1: TEdit;
    lblL_Shape_Transform: TLabel;
    edtE_Side: TEdit;
    lblL_Side: TLabel;
    bvl1: TBevel;
    lblL_Shape_Size: TLabel;

    procedure B_ExitClick(Sender: TObject);
    procedure B_Shape_DrowClick(Sender: TObject);
     procedure p_Fon_Show;
     procedure p_Shape_Drow;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_Lab_1: TF_Lab_1;
     Shape_Color:TColor;     // колір

   qXs,qYs:integer;  // Image Shape Size X, Y / Розмір зображення
   mXs,mYs:array[1..3] of integer;

implementation

{$R *.dfm}

 Procedure TF_Lab_1.B_ExitClick(Sender: TObject);
  Begin
    Application.Terminate;
  End;

 Procedure TF_Lab_1.p_Fon_Show;
  Var
     xs,ys:integer;
     r1,r2,g1,g2,b1,b2:byte;
     r,g,b:byte;
  Begin
    // Shape_Fon Show, показати фон
     r1:=250;  // up R (color)
     r2:=240;  // down R (color)
      g1:=100;
      g2:=240;
       b1:=0;
       b2:=0;
   for ys:=1 to qYs do
    begin
      r:=round(r1+(r2-r1)*(ys-1)/(qYs-1));
      g:=round(g1+(g2-g1)*(ys-1)/(qYs-1));
      b:=round(b1+(b2-b1)*(ys-1)/(qYs-1));
    for xs:=1 to qXs do
     begin
       Image_S.Picture.Bitmap.Canvas.Pixels[xs-1,ys-1]:=RGB(r,g,b);
     end; // xs
    end; // ys
  End;

 Procedure TF_Lab_1.p_Shape_Drow;
  Var
     n,n1:integer;
     x1,y1,x2,y2:integer;
  Begin
    // Shape_Show, показати зображення
     for n:=1 to 3 do   // N - Node, вершина
      begin
        n1:=n+1;
        if n1>3 then n1:=1;
       x1:=mXs[n];
       y1:=mYs[n];
        x2:=mXs[n1];
        y2:=mYs[n1];
       Image_S.Picture.Bitmap.Canvas.MoveTo(x1,y1);
        Image_S.Picture.Bitmap.Canvas.LineTo(x2,y2);
      end; // n
  End;

 Procedure p_Shape_Calc(s:integer);
   // Shape Calculation
  Var
     n:integer;
     r,a,ar:real;
     xc,yc:integer;
  Begin
    r:=qXs/2.5;  // Radius
    a:=0;
     xc:=qXs div 2;
     yc:=qYs div 2;
     // r:=r-(s-1)*5;
      ar:=(s-1)*5*3.1415/180;  // Angle (Rotate)
   for n:=1 to 3 do  // Node
    begin
      mXs[n]:=xc+round(r*cos(a+ar));
      mYs[n]:=yc+round(r*sin(a+ar));
      // mXs[n]:=mXs[n]+(s-1)*2;  // Shift X
      // mYs[n]:=mYs[n]+(s-1)*2;  // Shift Y
        a:=a+120*3.1415/180;  // Angle (Node)
    end; // n
  End;

 Procedure TF_Lab_1.B_Shape_DrowClick(Sender: TObject);
  Var
     s:integer;
  Begin
   // Shape Drow
     Shape_Color:=RGB(150,0,0);   // Color / колір
    Image_S.Picture.Bitmap.Create;
    qXs:=Image_S.Width;
    qYs:=Image_S.Height;
     Image_S.Picture.Bitmap.Width:=qXs;
     Image_S.Picture.Bitmap.Height:=qYs;
     Image_S.Picture.Bitmap.Canvas.Pen.Color:=Shape_Color;
    p_Fon_Show;
   for s:=1 to 7 do  // s - Shape
    begin
     Image_S.Picture.Bitmap.Canvas.Pen.Width:=2;
      p_Shape_Calc(s);
      p_Shape_Drow;
    end; // s
  End;

END.

Последний раз редактировалось Stilet; 18.09.2012 в 21:05.
Determinant666 вне форума Ответить с цитированием
Старый 18.09.2012, 23:37   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

На форме расположено 3 компонета TEdit:
1 - Длина стороны
2 и 3 - углы.

Треугольник рисуется прямо на форме в событии перерисовки формы. И еще используются функции из модуля Math.
Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  a, b: Extended;
  a1, c1: Extended;
  x, y: Integer;
  sinC, cosC: Extended;
  PointList: array[1..3] of TPoint;
  i: Integer;
begin
  // Сторона
  b := StrToInt(Edit1.Text);
  // Угол A
  a1 := DegToRad(StrToInt(Edit2.Text));
  c1 := DegToRad(StrToInt(Edit3.Text));

  // Координаты начало рисования
  x := Round((ClientWidth - b) / 2);
  y := ClientHeight div 2;

  PointList[1] := Point(x, y);
  PointList[2] := Point(Round(x + b), Y);

  // рассчет стороны A
  a := b * sin(a1) / sin(a1 + c1);
  SinCos(C1, sinC, cosC);
  PointList[3] := Point(Round(x + b - cosC * a), Round(y - sinC * a));

  //Рисование
  with PointList[3] do Canvas.MoveTo(X, Y);

  for i := 1 to 3 do
  begin
    with PointList[i] do
      Canvas.LineTo(X, Y);
  end;
end;
Формулы для треугольника

Последний раз редактировалось kangreon; 18.09.2012 в 23:40.
kangreon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение угла по двум катетам прямоугольного треугольника. #include <Markus> Общие вопросы C/C++ 1 13.06.2012 16:00
Расчёт S и P треугольника через его стороны и/или углы Matrix6993 Общие вопросы Delphi 6 23.02.2012 00:07
поргаммка вычисляющая стороны треугольника...) mga Помощь студентам 0 06.11.2010 21:51
кратчайшее расстояние от заданной точки до ближайщей стороны треугольника ddeman666 Помощь студентам 1 03.05.2010 14:47