Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Площадь круга нарисованого вокруг прямоугольника 
:(
    Опции темы
Recev
  Дата 21.1.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Нужно задать размеры прямоугольника и потом нарисовать на канвасе формы этот прямоугольник, затем нарисовать вокруг него круг и вычислить площадь этого круга.
Как такое сделать? Я не могу понять как нарисовать круг вокруг прямоугольника.
PM MAIL   Вверх
Poseidon
Дата 21.1.2011, 15:04 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Вообще-то, на сколько я помню из геометрии, центр такого круга можно высчитать. И радиус такого круга высчитывается. А зная центр и радиус, на конве рисовать с помощью Ellipse. 
Код

canvas.Ellipse(x-radius,y-radius,x+radius,y+radius); // x,y - коорд. центра

У прямоугольника центром круга вроди как будет точка пересечения диагоналей. Зная координаты углов и длины сторон, можно вычислить координату точки пересечения диагоналей.

Ну и площать круга, зная радиус, считается как "ДваПиЭрКвадрат" smile

И на последок, код писать наврятли кто будет в нуля.


Это сообщение отредактировал(а) Poseidon - 21.1.2011, 15:06


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Recev
Дата 21.1.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Код

procedure TForm1.Button1Click(Sender: TObject);
var dim, rad : integer;
x1, x2, y1, y2 : integer;
begin
x1 := strtoint(edit1.Text);
y1 := strtoint(edit2.Text);
x2 := strtoint(edit3.Text);
y2 := strtoint(edit4.Text);
//dim
with Image1.Canvas do begin
Rectangle(x1,y1, x2, y2);
Moveto(x1, y1);
LineTo(x2, y2);
Pixels [((x1 + x2) div 2), ((y1 + y2) div 2)] := clRed; // это центр прямоугольника и круга
end;
end;

Центр нашел, не получается правильно нарисовать круг.
PM MAIL   Вверх
Snowy
Дата 21.1.2011, 17:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код

    cx := ((x1 + x2) div 2); // центр окружности
    cy := ((y1 + y2) div 2);
    // диаметр вычисляем, по формуле расстояния между двумя точками на плоскости
    rad := Round(sqrt(Sqr(x2-x1) + Sqr(y2-y1)) / 2); // радиус = диаметр / 2
    Brush.Style := bsClear; // не заполнять круг - рисуем только окружность
    // Для отрисовки круга используем эллипс, т.к. круг - частный случай эллипса.
    // для отрисовки эллипса, нужно указать крайние точки в плоскости:
    // x1 - крайняя левая точка по горизонтали, y1 - крайняя верхняя по вертикали, x2 - правая, y2 - нижняя.
    // Т.к. у круга все точки равноудалены от центра на радиус, то крайние точки считаем +- радиус от центра.
    Ellipse(cx-rad, cy-rad, cx+rad, cy+rad); // рисуем эллипс от центра cx по радиусу rad

PM MAIL   Вверх
Recev
Дата 21.1.2011, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



А как тогда же площадь правильно обчистить? У меня компилятор ругается про несовместимость типов. IntToFloat не спасает.
Код

procedure TForm1.Button1Click(Sender: TObject);
var cx, cy, rad, pl : integer;
x1, x2, y1, y2 : integer;
begin
x1 := strtoint(edit1.Text);
y1 := strtoint(edit2.Text);
x2 := strtoint(edit3.Text);
y2 := strtoint(edit4.Text);
with Image1.Canvas do begin
Rectangle(x1,y1, x2, y2);
cx := ((x1 + x2) div 2);
cy := ((y1 + y2) div 2);
rad := Round(sqrt(Sqr(x2-x1) + Sqr(y2-y1)) / 2);
Brush.Style := bsClear;
Ellipse(cx-rad, cy-rad, cx+rad, cy+rad);
pl := power((2*pi)*(IntToFloat(rad)), 2);
ShowMessage('Площадь круга = ' + inttostr(pl));
end;
end;


Это сообщение отредактировал(а) Recev - 21.1.2011, 18:30
PM MAIL   Вверх
Snowy
Дата 21.1.2011, 18:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



IntToFloat не существует.
Integer умножать на Float можно без каких-либо преобразований - и то и другое - числа.
Возвести в квадрат - Sqr
Sqr(2 * pi * rad)
Соответственно, результат - не целое число.
Либо округляй через Round, либо так и выводи с дробной частью.
PM MAIL   Вверх
Poseidon
Дата 21.1.2011, 22:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Snowy @  21.1.2011,  18:43 Найти цитируемый пост)
Возвести в квадрат - Sqr
Sqr(2 * pi * rad)

Только чуток не так.
2*pi*Sqr(rad)



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 22.1.2011, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Poseidon @  21.1.2011,  22:10 Найти цитируемый пост)
Только чуток не так.2*pi*Sqr(rad)

Действительно.
Засмотрелся на код выше.
В квадрат только радиус.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.