IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Графики функций
Провинциалка
сообщение 19.02.2012 11:31
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Здравствуйте!
Осваиваю новую тему в Delphi - графика. Дали задание - построить графики на Canvas в Image.
На основе примеров, данных на лекции, попыталась сделать это сама, но не получается. Даже парабола, код которой дали не выводится. Подскажите ошибку в построении параболы. Вод её код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
x,y,x2,y2: real;
step:real;
begin
x2:=-2;
while x2 < 2 do
begin
y2:=sqr(x2);
form1.Image1.canvas.Pixels[x+trunc(x2*step),y-trunc(y2*step)]:=clblack;
x2:=x2 + 0.001;
end;
end;


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.02.2012 11:42
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Даже парабола, код которой дали не выводится.
Я тебе больше скажу, она не только не выводится, но программа даже не компилируется. И еще больше: и правильно делает. Потому что
1) для того, чтобы делать так, как ты делаешь - надо чтобы x, y были типа Integer, а не real, иначе будет несоответствие типов;
2) чтобы программа не только компилировалась, но и работала, неплохо бы инициализировать ВСЕ переменные. У тебя X, Y и Step - не инициализированы, а поскольку они локальные, то содержат мусор. Результатам доверять нельзя.

Если сделать X := Image1.Width div 2, и, соответственно, Y установить в половину высоты, и задать какое0то значение переменной Step, то парабола прекрасно отрисуется...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 19.02.2012 12:56
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Да, действительно, всё здорово получилось при такой коррекции:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y: integer;
x2,y2: real;
step:real;
begin
x := Image1.Width div 2;
y := Image1.Width div 2;
x2:=-2;
step:=30;
while x2 < 2 do
begin
y2:=sqr(x2);
form1.Image1.canvas.Pixels[x+trunc(x2*step),y-trunc(y2*step)]:=clblack;
x2:=x2 + 0.001;
end;


Даже душа поет! СПАСИБО!
Может подскажете, как обрезать "усы" у параболы ? (С линиями y=4, надеюсь, сама разберусь и покажу как сделала)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.02.2012 17:52
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Что значит "Обрезать усы"? В каком интервале X просила нарисовать параболу - в таком она и нарисована, изменяй начальное/конечное значение X - получишь более "короткие усы" smile.gif Или более длинные, смотря как изменишь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 19.02.2012 18:32
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Извините, я не смогла понять вот это
Цитата
изменяй начальное/конечное значение X
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.02.2012 18:38
Сообщение #6


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


x2 := -1.5;
// ...
while x2 < 1.5 do
// ...
Какой длины "усы" теперь?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 19.02.2012 19:02
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Поняла теперь. Спасибо!
Теперь постараюсь правильно выполнить остальную часть задания.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 19.02.2012 19:49
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Попыталась поставить оси координат, но получается несостыковка начала осей и нижней части параболы. Как так?
x2:=x2 + 0.001;
end;
form1.Image1.canvas.MoveTo(0,Height div 2);
form1.Image1.canvas.LineTo(Width ,Height div 2);
form1.Image1.canvas.MoveTo(Width div 2,0);
form1.Image1.canvas.LineTo(Width div 2, Height-200);
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.02.2012 20:03
Сообщение #9


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Как так?
Когда ты говоришь компилятору Height, он должен сам догадаться, что надо взять не Form1.Height, а Image1.Height? Этого Дельфи делать не умеет smile.gif Указывай, ширина/высота чего имеется в виду
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 19.02.2012 20:20
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Вау!!! Получилось!!! Спасибо!
Вы знаете, я даже сама успела сообразить (посмотрев свой конспект), что надо добавлять form1.Image1.
Пойду попью чаю и продолжу свою работу!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.02.2012 20:35
Сообщение #11


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Кстати, Form1 добавлять не обязательно, кнопка, нажатие на которую ты обрабатываешь, лежит на этой же форме, так что все обращения будут по умолчанию к контролам, лежащим на Form1.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 19.02.2012 20:52
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Это интересно. Любопытно то, что преподаватель-то писал на доске именно так: form1.Image1. Ну да ладно.
Сейчас вот пытаюсь придумать, как прочертить оставшиеся две линии: у=4. Самое страшное это то, что у меня нет никаких вариантов по этому поводу. unsure.gif

Сообщение отредактировано: Провинциалка - 19.02.2012 20:53
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 20.02.2012 0:30
Сообщение #13


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Аналогично. Абсцисса изменяется как и в предыдущем случае, а ордината в Твоем случае будет у - 4.
Еще лучше это сделать с помощью линии, задав начало и конец.

Сообщение отредактировано: sheka - 20.02.2012 0:31
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 20.02.2012 9:34
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Цитата
Еще лучше это сделать с помощью линии, задав начало и конец.

Я вообщем-то тоже так рассуждала, просто затрудняюсь в том, как задать начало
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 20.02.2012 23:15
Сообщение #15


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Раз пишешь в делфях, то используешь LineTo.
Далее пытаемся подумать, где же кроется ответ? Конечно же гугл! Что же в него забить в запрос? Да то, что знаем: "delphi lineto". Первая ссылка дает нужный результат: http://www.codenet.ru/progr/delphi/stat/gdi.php
Тут уже, чтобы долго не искала подсказка: нажми Ctrl+f , введи Рисование линий и нажми enter. Нужный раздел открыт smile.gif
Цитата
MoveTo Перемещает точку начала рисования линии в указанные координаты x и y Canvas.MoveTo(50, 100);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Провинциалка
сообщение 21.02.2012 14:18
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Спасибо всем за помощь. Задание выполнено!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 29.03.2024 14:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"