Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Домашнее задание на лето. (http://www.tehnari.ru/f41/t38306/)

Жан 26.07.2010 18:37

Домашнее задание на лето.
 
Нам задали сделать программу на делфи для решения функций и + графики к ним помогите хоть с одним графиком разобратся y=kx+b, а то осенью преопод :tehnari_ru_093:

artes33 27.07.2010 22:01

Нельзя решить функцию, можно подсчитать ее значение при заданных аргументах. А программу будем делать так: рисовать будет прямо на канве формы, для удобства возьмем самый естественный в данной ситуации масштаб: 1 ед. = 1 пиксель. Так проще. Начнем! Кидай на форму 1 TButton и 2 TLabeledEdit. Желательно разместить их в одном углу формы, чтобы потом не очень мешались. Надпись к LabeledEdit1 - "k", к LabeledEdit2 - "b". к едитам в OnKeyPress пиши:
Код:

  case key of
    '0'..'9', '-', #8:;
      else key := #0;
  end;

Это чтобы лишнего не вводили. В обработчике кнопки:
Код:

procedure TForm1.Button1Click(Sender: TObject);
var
  W, H : cardinal;
  halfW, halfH, x, y : double;
  ixPrev, iyPrev, k, b : integer;
  ix, iy : cardinal;
begin
  repaint;
  W := Form1.Width;
  H := Form1.Height;
  k := StrToIntDef(Form1.LabeledEdit1.Text, 0);
  b := StrToIntDef(Form1.LabeledEdit2.Text, 0);
  halfW := W / 2;
  halfH := H / 2;
  Form1.Canvas.MoveTo(round(halfW), 0);
  Form1.Canvas.LineTo(round(halfW), H);
  Form1.Canvas.MoveTo(0, round(halfH));
  Form1.Canvas.LineTo(W, round(halfH));
  ixPrev := 0;
  iyPrev := round(halfH);
    for ix := 0 to W - 1 do
    begin
      x := (ix - halfW);
      y := k * x + b;
      iy := round(halfH - y);
      Form1.Canvas.MoveTo(ixPrev, iyPrev);
      Form1.Canvas.LineTo(ix, iy);
      ixPrev := ix;
      iyPrev := iy;
    end;
end;

В принципе y = kx + b можно решить и легче, но, как я понял, будут другие функции. Функцию задавать при присвоение значение переменной игрек: y := k * x + b;. ВАЖНО: т.к. масштаб 1 пиксель, то сложно будет отличить y = 3x + 2 и y = 3x + 3. Чтобы глаз человека мог это воспринимать надо либо увеличивать на десятки: y = 3x + 20 и y = 3x + 30, либо добавить в программу работу с масштабом иным.

Жан 28.07.2010 07:02

Стоп, стоп, но здесь же ведь чистая математика и почему объявление переменных так много ведь помоему проще объявить так
Цитата:

var k,b,real;
x, y,:integer;
k, b,:integer;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
(тут задаем цвет и толщену пера)
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.Pen.Width:=2;
(а это закраска цветом фона предедущего графика)
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.He ight)
(рисуем оси координат)
Ну, а дальше я застреваю знаю, что надо писать наверное в цикле for и математическую формулу нахождения x:=-b/k. И у меня не получается объявить, что y=0 первоначально, а если честно, то я запутался можете объяснить, где, что я не правильно начал.

Long Cat 28.07.2010 07:50

От себя пять копеек добавлю. В цикле имеем:
Цитата:

Сообщение от artes33 (Сообщение 367039)
Код:

      Form1.Canvas.MoveTo(ixPrev, iyPrev);
      Form1.Canvas.LineTo(ix, iy);


Смысла в MoveTo нет, так как перо остается в той точке, куда его переместила LineTo.
Нет необходимости запоминать координаты пера в переменных ixPrev и iyPrev.

Жан 28.07.2010 08:53

Если честно в моей голове уже каша! А поточнее можно разжевать информацию.

AlexZir 29.07.2010 01:37

В OnKeyPress еще желательно добавить код клавиши Backspace.
Цитата:

не получается объявить, что y=0 первоначально
y:=0;
Цитата:

x, y,:integer;
k, b,:integer;
Переменные для аргумента, приращения аргумента и значения функции желательно задавать вещественным типом, так как неизвестно, какие значения будет задавать пользователь при использовании вашей программы и что будет получено в результате вычислений.

artes33 29.07.2010 18:42

AlexZir, в OnKeyPress код бекспейса есть:

Код:

  case key of
    '0'..'9', '-', #8:;
      else key := #0;
  end;

#8 - Вот он.

Жан, начал ты, может быть, и правильно, однако цвет пера, его толщина и пр. - это вторично. В моем коде построение прямой y = kx + m. Т.е. то, что ты писал в первом посте. Ткни пальцем, что именно не понятно.

Vladimir_S 29.07.2010 18:52

Цитата:

Сообщение от Long Cat (Сообщение 367153)
От себя пять копеек добавлю.
Смысла в MoveTo нет, так как перо остается в той точке, куда его переместила LineTo.
Нет необходимости запоминать координаты пера в переменных ixPrev и iyPrev.

И от меня грошик: один раз надо использовать MoveTo. Перед циклом.

Long Cat 29.07.2010 19:02

Цитата:

Сообщение от Vladimir_S (Сообщение 367974)
И от меня грошик: один раз надо использовать MoveTo. Перед циклом.

Ну, я писал про то, что происходит внутри цикла :-).

Vladimir_S 29.07.2010 19:08

Цитата:

Сообщение от Long Cat (Сообщение 367980)
Ну, я писал про то, что происходит внутри цикла :-).

Так я же не в порядке дискуссии, а исключительно в копилку. :D


Часовой пояс GMT +4, время: 21:37.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.