Как найти точку на координате паскаль

Перейти к содержанию

Определение принадлежности точки кругу с центром в начале координат

Просмотров 25.9к. Обновлено 29 октября 2021

Будем считать, что точка принадлежит кругу, если находится внутри его или на его окружности.

Из любой точки координатной плоскости можно провести отрезок к началу координат. Если длина этого отрезка больше радиуса круга, то точка лежит за пределами круга и, следовательно, не принадлежит ему. Если же отрезок, соединяющий точку и начало координат, меньше радиуса круга с центром в начале координат или равен ему, то точка будет принадлежать кругу.

Отрезок между любой точкой и нулевой точкой (началом координат) является гипотенузой прямоугольного треугольника, катеты которого равны значениям x и y координаты данной точки.

Таким образом задача сводится по-сути к двум действия:

  1. Нахождение длины отрезка между точкой и началом координат по теореме Пифагора (квадрат длины гипотенузы равен сумме квадратов длин катетов).
  2. Сравнению полученного значения с радиусом круга.

Pascal

Определение принадлежности точки кругу с центром в начале координат паскаль


var x,y,r,h: real;
begin
write('координаты точки: ');
readln(x,y);
write('радиус круга: ');
readln(r);
h := sqrt(x*x + y*y);
if h > r then writeln('Точка не принадлежит кругу')
else writeln('Точка принадлежит кругу');
end.


координаты точки: -1 -2
радиус круга: 5
Точка принадлежит кругу

Язык Си


#include
#include
main() {
float x,y,r,h;
printf("Координаты точки: ");
scanf("%f%f", &x,&y);
printf("Радиус круга: ");
scanf("%f", &r);
h = sqrt(x*x + y*y);
printf("Гипотенуза равна %.2f. ", h);
if (h > r) printf("Точка не принадлежит кругу.n");
else printf("Точка принадлежит кругу.n");
}



Координаты точки: 4 5
Радиус круга: 10
Гипотенуза равна 6.40. Точка принадлежит кругу.

Для gcc компилировать с ключом -lm.

Python

Определение принадлежности точки кругу с центром в начале координат Python


from math import sqrt

x = float(input("x="))
y = float(input("y="))
r = float(input("r="))
h = sqrt(x**2 + y**2)
print("Расстояние до точки от начала координат равно %.2f" % h)
if h > r:
print("точка находится за пределами круга")
else:
print("точка принадлежит кругу")



x=10
y=-3
r=5
Расстояние до точки от начала координат равно 10.44
точка находится за пределами круга

КуМир


алг точка_круг
нач
вещ x,y,r,h
вывод "Координаты точки: "
ввод x,y
вывод "Радиус круга: "
ввод r
h := sqrt(x**2 + y**2)
если h > r то вывод "Не принадлежит"
иначе вывод "Принадлежит"
все
кон



Координаты точки: 1.6 -2.1
Радиус круга: 4
Принадлежит

Basic-256


input "x=", x
input "y=", y
input "r=", r
h = sqrt(x^2 + y^2)
if h > r then
print "Не принадлежит"
else
print "Принадлежит"
endif

Определение принадлежности точки кругу с центром в начале координат

Вводятся координаты (x;y) точки и радиус круга ( r ). Определить принадлежит ли данная точка кругу, если его центр находится в начале координат.

Будем считать, что точка принадлежит кругу, если находится внутри его или на его окружности.

Из любой точки координатной плоскости можно провести отрезок к началу координат. Если длина этого отрезка больше радиуса круга, то точка лежит за пределами круга и, следовательно, не принадлежит ему. Если же отрезок, соединяющий точку и начало координат, меньше радиуса круга с центром в начале координат или равен ему, то точка будет принадлежать кругу.

Отрезок между любой точкой и нулевой точкой (началом координат) является гипотенузой прямоугольного треугольника, катеты которого равны значениям x и y координаты данной точки.

Таким образом задача сводится по-сути к двум действия:

  1. Нахождение длины отрезка между точкой и началом координат по теореме Пифагора (квадрат длины гипотенузы равен сумме квадратов длин катетов).
  2. Сравнению полученного значения с радиусом круга.

Pascal

Определение принадлежности точки кругу с центром в начале координат паскаль

Язык Си

Для gcc компилировать с ключом -lm.

Python

Определение принадлежности точки кругу с центром в начале координат Python

Уравнение для проверки, если точка находится внутри круга

Если у вас есть круг с центром (center_x, center_y) и радиусом radius , как вы проверяете, находится ли заданная точка с координатами (x, y) внутри круга?

В общем, x и y должен удовлетворить (x – center_x)^2 + (y – center_y)^2 .

Обратите внимание, что точки, которые удовлетворяют приведенному выше уравнению с заменой на == , считаются точками на окружности, а точки, которые удовлетворяют приведенному выше уравнению с заменой на > , считаются вне круга.

Математически Пифагор, вероятно, является простым методом, как многие уже упоминали.

В вычислительном отношении есть более быстрые способы. Определение:

Если точка с большей вероятностью находится за пределами этого круга, то представьте квадрат, нарисованный вокруг него так, что его стороны касаются этого круга:

Теперь представьте квадратный ромб, нарисованный внутри этого круга так, чтобы его вершины касались этого круга:

Теперь мы покрыли большую часть нашего пространства, и только небольшая область этого круга остается между нашим квадратом и алмазом, подлежащим проверке. Здесь мы возвращаемся к Пифагору, как указано выше.

Если точка скорее всего находится внутри этого круга, то в обратном порядке первые 3 шага:

Альтернативные методы представляют квадрат внутри этого круга вместо ромба, но для этого требуется немного больше тестов и расчетов без вычислительных преимуществ (внутренний квадрат и ромбы имеют одинаковые площади):

Для тех, кто заинтересован в производительности, я реализовал этот метод в c и скомпилировал с -O3.

Я получил время выполнения time ./a.out

Я реализовал этот метод, обычный метод и фиктивный метод для определения временных затрат.

Normal: 21.3s This: 19.1s Overhead: 16.5s

Таким образом, кажется, что этот метод является более эффективным в этой реализации.

Найти, если точка лежит внутри круга

По заданной окружности (координаты центра и радиуса) и точке (координате) определите, находится ли точка внутри или на окружности или нет.

Примеры :

Мы настоятельно рекомендуем вам свернуть браузер и попробовать это в первую очередь.
Идея состоит в том, чтобы вычислить расстояние точки от центра. Если расстояние меньше или равно радиусу. Дело в том, что внутри, а снаружи.

Ниже приведена реализация вышеуказанной идеи.

// C ++ программа для проверки, если точка
// лежит внутри круга или нет
#include

using namespace std;

bool isInside( int circle_x, int circle_y,

int rad, int x, int y)

// Сравнить радиус круга с расстоянием

// его центра от заданной точки

if ((x – circle_x) * (x – circle_x) +

(y – circle_y) * (y – circle_y)

int circle_x = 0, circle_y = 1, rad = 2;

isInside(circle_x, circle_y, rad, x, y) ?

cout “Inside” : cout “Outside” ;

// Java-программа для проверки, лежит ли точка
// внутри круга или нет

static boolean isInside( int circle_x, int circle_y,

int rad, int x, int y)

// Сравнить радиус окружности с

// расстояние его центра от

if ((x – circle_x) * (x – circle_x) +

(y – circle_y) * (y – circle_y)

// Программа драйвера для проверки вышеуказанной функции

public static void main(String arg[])

int circle_x = 0 , circle_y = 1 , rad = 2 ;

if (isInside(circle_x, circle_y, rad, x, y))

// Этот код предоставлен Anant Agarwal.

# Python3 программа для проверки
# точка лежит внутри круга
# или не

def isInside(circle_x, circle_y, rad, x, y):

# Сравнить радиус круга

# с расстоянием от его центра

# от заданной точки

if ((x – circle_x) * (x – circle_x) +

(y – circle_y) * (y – circle_y) = rad * rad):

if (isInside(circle_x, circle_y, rad, x, y)):

# Этот код добавлен
# Митс.

// C # программа для проверки, лежит ли точка
// внутри круга или нет

static bool isInside( int circle_x, int circle_y,

int rad, int x, int y)

// Сравнить радиус окружности с

// расстояние его центра от

if ((x – circle_x) * (x – circle_x) +

(y – circle_y) * (y – circle_y)

// Программа драйвера для проверки вышеуказанной функции

public static void Main()

int circle_x = 0, circle_y = 1, rad = 2;

if (isInside(circle_x, circle_y, rad, x, y))

// Этот код предоставлен нитин митталь.

// PHP программа для проверки, если точка
// лежит внутри круга или нет

function isInside( $circle_x , $circle_y ,

// Сравнить радиус круга

// с расстоянием от центра

// из заданной точки

if (( $x – $circle_x ) * ( $x – $circle_x ) +

( $y – $circle_y ) * ( $y – $circle_y )

$circle_x = 0; $circle_y = 1; $rad = 2;

if (isInside( $circle_x , $circle_y ,

// Этот код добавлен
// нитин митталь.
?>

Выход :

Спасибо Уткаршу Триведи за предложенное решение

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

[spoiler title=”источники:”]

http://qastack.ru/programming/481144/equation-for-testing-if-a-point-is-inside-a-circle

[/spoiler]

  • В начало
  • Паскаль
  • Задачник
  • Графика
  • Карта сайта

Давайте поговорим о процедурах SetPixel(x, y, c) и PutPixel(x, y, c), которые выполняют одну и ту ж работу – закрашивают пиксель с координатами (x, y) цветом c. Но зачем это надо – закрашивать точки в разные цвета? Дело в том, что любое изображение состоит из точек (пикселей), каждая из которых имеет определенный цвет и свои координаты графическом окне Pascal. Во второй части статьи (см. внизу) мы покажем, как с помощью закрашивания пикселей нарисовать прямоугольник в Паскале, отрезок линии, круг и даже эллипс. А пока немного поговорим о геометрии.

Точки в графическом окне Паскаля

Простейшим геометрическим объектом в математике является точка – нечто такое, не имеющее никакого размера, ни объема, ни площади. Правда, чтобы точку нарисовать, придется придать ей хоть какой-то размер (иначе её изобразить невозможно). Из точек построены все линии и фигуры, поверхности и тела – как на плоскости, так и в пространстве.

Чем отличается фигура от линии? Замкнутая линия на плоскости – это только граница, край, а фигура – часть плоскости, находящаяся внутри замкнутой линии. Примером линии является окружность, а соответствующая ей фигура – круг (часть плоскости).

Геометрическим телом называется множество точек в пространстве. Только не любое множество, а вся совокупность точек, отделенная от остального пространства какой-то границей, называемой поверхностью. Тело – это уже геометрическая фигура в пространстве. Примеры геометрического тела: куб, тетраэдр, шар, параллелепипед и др.

Создание изображения в Паскале реализуются с помощью растровой графики (точечной графики). Это значит, что наименьшим элементом рисунка является точка, называемая пикселем, которых представляют обычно в виде маленьких кружков или квадратиков. Если взять любое растровое изображение и сильно его увеличить, то можно увидеть отдельные области, из которых и состоит всё изображение – пиксели. Каждый пиксель имеет один цвет, и его уже нельзя разделить на меньшие части.

Другой важной характеристикой пикселя является его координаты в графическом окне, которые отсчитываются с левого верхнего угла вправо (ось OX) и вниз (ось OY). Раз так, то есть природная необходимость в подпрограммах, которые бы задавали цвет и координаты пикселя. Или, наоборот, при наличии рисунка в графическом окне было бы интересно узнать цвет пикселя с данными координатами.

Причем первые две процедуры – SetPixel и PutPixel – являются равнозначными, и вы можете использовать любую из них. Чтобы продемонстрировать действие данных процедур, давайте напишем несколько простых программ. А вот функцией GetPixel(x,y) мы займемся на следующей странице. Но сначала укажем некоторые цветовые константы – названия стандартных цветов в PascalABC.Net:

Есть многие другие цветовые константы, но нам пока этого хватит.

Итак, попробуем нарисовать точку в PascalABC.Net с координатами, например, (300, 200), окрашенную в красный цвет. Чтобы мы её увидели, напишем возле неё слово «точка». Для этого создадим простую программу, подключив к ней модуль GraphABC:

Program my_Point;
uses
  GraphABC; //подключенный модуль для работы с графикой

begin
  { Красная точка с координатой (300,200): }
  SetPixel(300, 200, clRed);
  { Надпись возле точки: }
  TextOut(301, 200, 'точка')
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**procedure** SetPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clRed – красный
**procedure** TextOut(x,y: integer; s: string);: Выводит строку s в прямоугольник к координатами левого верхнего угла (x,y)
Запустите приложение и в открывшемся графическом окне попробуйте найти маленькую красную точку чуть выше слева слова «точка». Это и есть пиксель с координатами (300, 200). Но точки создавать не интересно. Если бы мы нарисовали совокупность точек, идущих друг за другом, например, в горизонтальном направлении, то получили бы уже линию. Давайте так и сделаем.

Как построить линию в PascalABC.Net с помощью точек? Строить линию точками, каждый раз записывая процедуру SetPixel (или PutPixel), это не правильно, поскольку для этого пришлось бы записывать SetPixel огромное количество раз. Вместо этого построение можно организовать в цикле, в котором, шаг за шагом, точки сами будут выстраиваться в прямую линию.

Нарисуем линию от точки с координатами (100, 200) до точки (400, 200). Как видим, эта прямая будет параллельна оси OX (горизонтальна в нашем понимании), поскольку начало и конец отрезка имеют одинаковую координату y = 200. Таким образом, изменять придется только координату x – от 100 до 400, а для этого мы используем цикл for (с параметром) и процедуру SetPixel. Вот какая программа у нас вышла:

Program my_Line;

uses
  GraphABC;

var
  x: integer; 

begin
  for x := 100 to 400 do
    SetPixel(x, 200, clRed)
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**procedure** SetPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clRed – красный
Созданная нами линия имеет толщину 1 пиксель. А чтобы нарисовать жирную линию, нужно, естественно, построить несколько линий рядом, накладывая их как бы одну на другую столько раз, какова толщина линии. Поскольку мы будем менять не только x, но и y, то здесь не обойтись без вложенного двойного цикла. Во внешнем цикле будем изменять y, а во внутреннем – координату x. Результат наших размышлений:

Program my_Line2;

uses
  GraphABC;
 
var
  i, x, x1, x2, y, d: integer;
 
begin
  d := 3; //толщина отрезка
  x1 := 100; x2 := 400; //абсцисса начала и конца отрезка
  y := 200; //ордината отрезка 
  for i := 0 to d - 1 do //наращиваем толщину отрезка
    for x := x1 to x2 do
      PutPixel(x, y + i, clBlue)
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**procedure** PutPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clBlue – синий
Линия и жирная линия в Pascal

Как создать прямоугольник в PascalABC.Net с помощью точек? Поскольку рисовать отрезки мы уже научились, то для создания прямоугольника придется начертить всего четыре отрезка. Для этой цели достаточно задать координаты двух противоположных вершин прямоугольника – (x1, y1) и (x2, y2), где x2 > x1, y2 > y1, – а потом нарисовать четыре стороны (линии). Вот сам код с комментариями:

Program my_Rectangle;

uses
  GraphABC;
 
var
  x, y, x1, y1, x2, y2: integer; //координаты вершин прямоугольника
 
begin
  x1 := 100; y1 := 150; //координаты левого верхнего угла
  x2 := 400; y2 := 300; //координаты правого нижнего угла
  { Нижняя и верхняя сторона: }
  for x := x1 to x2 do begin //здесь изменяется x
    PutPixel(x, y1, clRed);
    PutPixel(x, y2, clRed)
  end;
  { Левая и правая сторона: }
  for y := y1 to y2 do begin //здесь изменяется y
    PutPixel(x1, y, clRed);
    PutPixel(x2, y, clRed)
  end
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**procedure** PutPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clRed – красный
**procedure** PutPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clRed – красный
**procedure** PutPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clRed – красный
**procedure** PutPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clRed – красный

А как закрасить прямоугольник в PascalABC.Net с помощью процедуры SetPixel или PutPixel? Для заливки прямоугольника каким-либо цветом используется тот же способ, что и при создании жирной линии: рисуются отрезки толщиной в 1 пиксель один за другим, пока их общая толщина не составит длину какой-то из сторон прямоугольника. Немного переформатировав код программы жирная линия, получим:

Program my_FillRectangle;

uses
  GraphABC;

var
  x, y, x1, y1, x2, y2: integer; //координаты вершин прямоугольника

begin
  x1 := 100; y1 := 150; //координаты левого верхнего угла
  x2 := 400; y2 := 300; //координаты правого нижнего угла
  for y := y1 to y2 do
    for x := x1 to x2 do 
      PutPixel(x, y, clBrown) //точки коричневого цвета
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**procedure** PutPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clBrown – коричневый
Прямоугольник и закрашенный прямоугольник в Pascal

Как нарисовать круг в PascalABC.Net с помощью точек? Можно закрасить не весь прямоугольник, а какую-то его часть, например, круг, находящийся в середине квадрата с координатами противоположных вершин (x0 – r, y0 – r) и (x0 + r, y0 + r). Мы знаем, что уравнение окружности с центром в точке (x0, y0) и радиусом r выглядит так:

(x – x<sub>0</sub>)<sup>2</sup> + (y – y<sub>0</sub>)<sup>2</sup> = r<sup>2</sup>.

Но нам нужна не окружность, а круг, то есть «внутренность» окружности. Это вся совокупность точек (x, y), для которых расстояние до центра (x0, y0) не больше r:

(x – x<sub>0</sub>)<sup>2</sup> + (y – y<sub>0</sub>)<sup>2</sup> ≤ r<sup>2</sup>.

Таким образом, чтобы закрасить круг в квадрате, необходимо его точки проверять на выполнение вышеуказанного неравенства: если оно истинно, то точки (x, y) закрашиваются. Вот соответствующая программа:

program my_circle;

uses
  GraphABC;

var
  x, y, x0, y0, r: integer;
  bln: boolean; { bln = true, если точка (x,y) находится внутри
                 круга, bln = false - в противном случае }

begin
  x0 := 250; y0 := 200; //координаты центра круга
  r := 110; //радиус круга
  { Проверяем все точки прямоугольника с координатами
  противоположных вершин (x0 - r, y0 - r) и (x0 + r, y0 + r): }
  for x := x0 - r to x0 + r do
    for y := y0 - r to y0 + r do begin
      { Выражение, означающее, что точка с координатами (x, y)
      находится внутри круга радиуса r и центром (x0, y0): }
      bln := sqr(x - x0) + sqr(y - y0) <= sqr(r);
      { Если точка (x, y) попадает внутрь данного круга,
      то закрашиваем её цветом clGreen: }
      if bln then SetPixel(x, y, clGreen)
    end
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** boolean;: Представляет логическое значение.
**function** Sqr(x: integer): integer;: Возвращает квадрат числа x.
**function** Sqr(x: integer): integer;: Возвращает квадрат числа x.
**function** Sqr(x: integer): integer;: Возвращает квадрат числа x.
**procedure** SetPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
Цвет: clGreen – зеленый

А как нарисовать закрашенный эллипс в PascalABC.Net с помощью точек? Для этого используем эллипс, вписанный в прямоугольник с координатами противоположных вершин (x1, y1) и (x2, y2), для которых x2 > x1, y2 > y1. Сначала укажем, что уравнение эллипса с центром в начале координат и полуосями a и b выглядит так:

(x/a)<sup>2</sup> + (y/b)<sup>2</sup> = 1.

Но поскольку нам необходимо закрасить внутреннюю часть эллипса, то уравнение превратится в неравенство заполненного эллипса:

(x/a)<sup>2</sup> + (y/b)<sup>2</sup> ≤ 1.

Стороны прямоугольника параллельны осям координат. Это означает, что координаты его центра равны полусумме координат противоположных вершин: x0 = (x1 + x2)/2, y0 = (y1 + y2)/2. А как найти a и b? Это стороны прямоугольника, разделенные на 2 (поэтому они называются полуосями): a = (x2 – x1)/2, b = (y2 – y1)/2. С учетом этого, неравенство заполненного эллипса приобретает вид:

(x – x<sub>0</sub>)<sup>2</sup>/a<sup>2</sup> + (y – y<sub>0</sub>)<sup>2</sup>/b<sup>2</sup> ≤ 1.

Program my_FillEllipse;

uses
  GraphABC;

var
  x, y, x1, y1, x2, y2, x0, y0, a, b: integer;
  bln: boolean; { bln = true, если точка (x,y) находится внутри
                 эллипса, bln = false - в противном случае }

begin
  x1 := 100; y1 := 150; { <== Координаты левого верхнего угла }
  x2 := 400; y2 := 300; { <== Координаты правого нижнего угла }
  { Координаты центра эллипса: }
  x0 := (x1 + x2) div 2;
  y0 := (y1 + y2) div 2;
  { Полуоси эллипса: }
  a := (x2 - x1) div 2;
  b := (y2 - y1) div 2;
  { Проверяем все точки прямоугольника с координатами
  противоположных вершин (x1, y1) и (x2, y2): }
  for x := x1 to x2 do
    for y := y1 to y2 do begin
      { Выражение, означающее, что точка (x, y) находится внутри
      эллипса с полуосями a и b и центром в точке (x0, y0): }
      bln := sqr((x - x0) / a) + sqr((y - y0) / b) <= 1;
      { Если точка (x, y) попадает внутрь данного эллипса,
      то закрашиваем её цветом RGB(250, 100, 200): }
      if bln then SetPixel(x, y, RGB(250, 150, 250))
    end
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** boolean;: Представляет логическое значение.
A **div** B – целочисленное деление А на В
A **div** B – целочисленное деление А на В
A **div** B – целочисленное деление А на В
A **div** B – целочисленное деление А на В
**function** Sqr(x: integer): integer;: Возвращает квадрат числа x.
**function** Sqr(x: integer): integer;: Возвращает квадрат числа x.
**procedure** SetPixel(x,y: integer; c: Color);: Закрашивает пиксел с координатами (x,y) цветом c
**function** RGB(r,g,b: byte): Color;: Возвращает цвет, который содержит красную (r), зеленую (g) и синюю (b) составляющие (r,g и b – в диапазоне от 0 до 255)
Круг и заполненный эллипс в Pascal

Как видно на рисунках эллипса и круга, создание изображений с помощью закрашивания пикселей имеет существенный недостаток: границы рисунков выглядят не совсем плавными, как бы ступенчатыми. Оно и понятно: ведь пиксели – не точки в геометрическом понимании, которые не имеют размера, а все-таки небольшие квадратики или кружки. Тогда почему на всех фотографиях и рисунках нет ступенек? – спросите вы. Да потому, что там используется так называемое сглаживание. Суть этого метода в основном состоит в том, чтобы ближайшие к границе точки заменять более светлыми, или точнее, наиболее близкими по цвету с фоном, из-за чего создается эффект плавного перехода.

Бывает и обратная ситуация, когда нужно не сгладить изображение, сделав границы плавными (особенно это касается геометрических фигур), а как бы размыть. Делается это так: берем несколько соседних пикселей изображения, имеющих обычно разный цвет, и заменяем на пиксели одинакового цвета, совпадающем с цветом одного из пикселей. Получается картинка с очень увеличенными пикселями.

То же касается и видео: бывает необходимость закрыть лицо персонажа такими же увеличенными пикселями, или часть области заменить одним цветом. В специализированных программах для работы с графикой типа Gimp, Photoshop или Movavi показывается замена пикселей одного цвета на пиксели другого цвета.

Скачать материал

без ожидания

Решение задач на попадание точки в заданную область

Скачать материал

без ожидания

  • Сейчас обучается 352 человека из 65 регионов

  • Сейчас обучается 32 человека из 18 регионов

Описание презентации по отдельным слайдам:

  • Решение задач на попадание точки в заданную область

    1 слайд

    Решение задач на попадание точки в заданную область

  • Примеры задач №1. Написать программу, которая определяет, попала ли точка с з...

    2 слайд

    Примеры задач
    №1. Написать программу, которая определяет, попала ли точка с заданными координатами (вводятся пользователем) в заштрихованную область. Попадание на границу считаем попаданием в область.
    Нужная область – пересечение двух областей: единичной окружности и прямой 𝑦=−𝑥+1.

  • Примеры задач Для проверки попадания точки в заданную область нужно проверить...

    3 слайд

    Примеры задач
    Для проверки попадания точки в заданную область нужно проверить условия:
    1. Точка лежит внутри единичной окружности:
    𝑥 2 + 𝑦 2 ≤1.
    2. Точка лежит на прямой или выше нее:
    𝑦≥−𝑥+1 (т.е. ординаты точек из заштрихованной области больше, чем ординаты точек, лежащих на прямой)
    Точка принадлежит нужной области, если эти условия выполняются одновременно (пересечение областей на рисунках ниже). Т.е. условия должны быть объединены конъюнкцией (логическая операция «И»).

  • Примеры задачСоставим блок-схему к этой задаче:
НачалоВвод х, уДаТочка попада...

    4 слайд

    Примеры задач
    Составим блок-схему к этой задаче:

    Начало
    Ввод х, у
    Да
    Точка попадает в область
    Точка не попадает в область
    Да
    Нет
    Нет
    Конец
    𝑥 2 + 𝑦 2 ≤1?
    𝑦≥−𝑥+1?

  • Примеры задачЗапишем теперь программу.1 способ – использование составного ус...

    5 слайд

    Примеры задач
    Запишем теперь программу.
    1 способ – использование составного условия

    var x, y: real;
    begin
    readln(x,y);
    if (y>=-x+1)and(sqr(x)+sqr(y)<=1) then writeln(‘Точка попадает в область)
    else
    writeln(‘Точка не попадает в область’);
    end.

  • Примеры задач2 способ – использование вложенных конструкций if-else
var x, y:...

    6 слайд

    Примеры задач
    2 способ – использование вложенных конструкций if-else
    var x, y: real;
    begin
    readln(x,y);
    if sqr(x)+sqr(y)<=1 then
    if y>=-x+1 then
    writeln(‘Точка попадает в область’)
    else
    writeln(‘Точка не попадает в область’);
    end.
    Какая ошибка допущена в программе? Подберите примеры координат точек, при которых программа будет работать неверно. Как исправить программу?

  • Примеры задач№2. Написать программу, которая определяет, попала ли точка с за...

    7 слайд

    Примеры задач
    №2. Написать программу, которая определяет, попала ли точка с заданными координатами (вводятся пользователем) в заштрихованную область. Попадание на границу считаем попаданием в область.

  • Примеры задачДанную область можно представить как объединение двух областей A...

    8 слайд

    Примеры задач
    Данную область можно представить как объединение двух областей A и B. Составим условия.
    Точка попадает в область А, если выполняются условия:
    Точка лежит выше прямой: 𝑦≥𝑥 (ординаты точек из области А больше, чем ординаты точек на прямой)
    Точка лежит ниже параболы: 𝑦≤2− 𝑥 2 (ординаты точек из области А меньше, чем ординаты точек параболы)
    Эти два условия должны выполняться одновременно, т.е. соединены оператором «И»
    Точка попадает в область В, если выполняются условия:
    Точка лежит ниже параболы: 𝑦≤2− 𝑥 2
    Точка лежит выше прямой 𝑦=0: 𝑦≥0
    Точка лежит ниже прямой 𝑦=𝑥 : 𝑦≤𝑥 (ординаты точек из области В меньше, чем ординаты точек на прямой)
    Эти три условия также должны быть соединены конъюнкцией.
    Так как исходная область представлена объединением областей А и В, то условия для А и В между собой должны быть соединены дизъюнкцией (оператор «ИЛИ»).
    Запишем условие на Паскале:
    (y>=x)and(y<=2-sqr(x))or(y<=2-sqr(x))and(y>=0)and(y<=x)
    Допишите программу самостоятельно.

  • Упражнения№1. Требовалось написать программу, которая вводит с клавиатуры коо...

    9 слайд

    Упражнения
    №1. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (х, у – действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
    var x, y:real;
    begin
    readln(x,y);
    if x*x+y*y>4 then
    if y>=-2 then
    if y<=x then
    write(‘Принадлежит’)
    else
    write(‘Не принадлежит’)
    end.
    Последовательно выполните следующее:
    Приведите пример таких чисел х и у, при которых программа работает неправильно.
    Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы.

  • Упражнения№2. Требовалось написать программу, которая вводит с клавиатуры коо...

    10 слайд

    Упражнения
    №2. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (х, у – действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
    var x,y:real;
    begin
    readln(x,y);
    if y<=x then
    if y<=-x then
    if y>=x*x-2 then
    write(‘Принадлежит’)
    else
    write(‘Не принадлежит’);
    end.
    В областях A, B, C, E1, E2, F не включаются границы закрашенной области D. Последовательно выполните следующее.
    1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих разным областям (A,B,C,D,E,F)

  • Упражнения№2. Требовалось написать программу, которая вводит с клавиатуры коо...

    11 слайд

    Упражнения
    №2. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (х, у – действительные числа) и определяет принадлежность точки заштрихованной области. Программист торопился и написал программу неправильно.
    var x,y:real;
    begin
    readln(x,y);
    if y<=x then
    if y<=-x then
    if y>=x*x-2 then
    write(‘Принадлежит’)
    else
    write(‘Не принадлежит’);
    end.
    В областях A, B, C, E1, E2, F не включаются границы закрашенной области D.
    2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы.

  • Домашнее задание1.https://informatics.mccme.ru/mod/statements/view3.php?chapt...

    12 слайд

    Домашнее задание
    1.https://informatics.mccme.ru/mod/statements/view3.php?chapterid=112169#1
    2.https://informatics.mccme.ru/mod/statements/view3.php?chapterid=112172#1
    3.https://informatics.mccme.ru/mod/statements/view3.php?id=16730&chapterid=112171#1

  • Использованные источники1. Информатика: пособие для подготовки к ЕГЭ/ Е. Т. В...

    13 слайд

    Использованные источники
    1. Информатика: пособие для подготовки к ЕГЭ/ Е. Т. Вовк [и др.]; под ред. Е. Т. Вовк. – М.: БИНОМ. Лаборатория знаний, 2013. – 322 с.

Найдите материал к любому уроку, указав свой предмет (категорию), класс, учебник и тему:

6 257 486 материалов в базе

  • Выберите категорию:

  • Выберите учебник и тему

  • Выберите класс:

  • Тип материала:

    • Все материалы

    • Статьи

    • Научные работы

    • Видеоуроки

    • Презентации

    • Конспекты

    • Тесты

    • Рабочие программы

    • Другие методич. материалы

Найти материалы

Другие материалы

Вам будут интересны эти курсы:

  • Курс повышения квалификации «Внедрение системы компьютерной математики в процесс обучения математике в старших классах в рамках реализации ФГОС»

  • Курс повышения квалификации «Организация работы по формированию медиаграмотности и повышению уровня информационных компетенций всех участников образовательного процесса»

  • Курс повышения квалификации «Облачные технологии в образовании»

  • Курс повышения квалификации «Сетевые и дистанционные (электронные) формы обучения в условиях реализации ФГОС по ТОП-50»

  • Курс повышения квалификации «Использование компьютерных технологий в процессе обучения в условиях реализации ФГОС»

  • Курс повышения квалификации «Специфика преподавания информатики в начальных классах с учетом ФГОС НОО»

  • Курс повышения квалификации «Применение MS Word, Excel в финансовых расчетах»

  • Курс профессиональной переподготовки «Математика и информатика: теория и методика преподавания в образовательной организации»

  • Курс повышения квалификации «Современные тенденции цифровизации образования»

  • Курс повышения квалификации «Современные языки программирования интегрированной оболочки Microsoft Visual Studio C# NET., C++. NET, VB.NET. с использованием структурного и объектно-ориентированного методов разработки корпоративных систем»

  • Курс повышения квалификации «Применение интерактивных образовательных платформ на примере платформы Moodle»

На занятии происходит знакомство с логическим типом Boolean в Паскале. Рассматривается алгоритм того, как находится минимальное и максимальное число в Паскале

Содержание:

  • Графика в Паскале
    • Управление цветом
    • Точки, отрезки и ломаные
    • Рисование фигур
    • Функция random для использования окраски
  • Анимация в Паскале

Графика в Паскале

Для работы с графикой в pascal abc используется модуль GraphABC. Для его подключения используется следующий код:

uses GraphABC;
begin
...
end.

Система координат в Паскале соответствует экранной системе координат и выглядит следующим образом:

Система координат в паскале

Система координат

Управление цветом

Для того, чтобы использовать цвет, необходимо применить этот цвет к инструменту перо:


  • SetPenColor(color) — устанавливает цвет пера, задаваемый параметром color;
  • setBrushColor(color) — устанавливает цвет кисти, задаваемый параметром color;
  • либо для палитры RGB: SetPenColor(rgb(0-255, 0-255, 0-255));
  • или использовать для заливки:

  • FloodFill(x,y,color) — заливает область одного цвета цветом color, начиная с точки (x,y).

После чего можно использовать процедуры для рисования геометрических фигур.

Цвета в pascal abc:

clBlack – черный
clPurple – фиолетовый
clWhite – белый
clMaroon – темно-красный
clRed – красный
clNavy – темно-синий
clGreen – зеленый
clBrown – коричневый
clBlue – синий
clSkyBlue – голубой
clYellow – желтый
clCream – кремовый
clAqua – бирюзовый
clOlive – оливковый
clFuchsia – сиреневый
clTeal – сине-зеленый
clGray – темно-серый
clLime – ярко-зеленый
clMoneyGreen – цвет зеленых денег
clLtGray – светло-серый
clDkGray – темно-серый
clMedGray – серый
clSilver – серебряный

Точки, отрезки и ломаные

Для отображения точки в паскале используется процедура:

  • SetPixel(x,y,color) — Закрашивает один пиксел с координатами (x,y) цветом color
  • точки в паскале

    uses GraphABC;
    begin
      SetPixel(300,200,clred);
    end.

    Для рисования линии используется:

  • Line(x1,y1,x2,y2) — рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2)
  • паскаль линия

    uses GraphABC;
    begin
      SetPenColor(clgreen);
      line(100,50,500,250);
    end.

    Ломаные можно рисовать с помощью процедур MoveTo (x1, y1) и LineTo (x2, y2).
    Процедуры работают в паре: MoveTo передвигает курсор в определенную точку, а процедура LineTo рисует линию с этой точки до точки, определенной параметром данной процедуры.
    ломаные в паскале

    uses GraphABC;
    begin
    ...
    SetPenColor(clblue);
    MoveTo (x1, y1);
    LineTo (x2, y2);
    LineTo (x3, y3);
    LineTo (x4, y4);
    LineTo (x5, y5);
    end.

    Задание 0: При помощи операторов SetPenColor(), LineTo (x2, y2) и MoveTo (x1, y1) нарисовать квадрат и равносторонний треугольник.

    [Название файла: L4_2task0.pas]

    Для установки размеров графического окна используется процедура

  • SetWindowSize(ширина, высота)
  • или, например:

    SetWindowWidth(600);
    SetWindowHeight(400);

    Рисование фигур

    Прямоугольник в Паскале рисуется:

  • Rectangle(x1,y1,x2,y2) — рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2).
  • прямоугольник в паскале

    uses GraphABC;
    begin
      Rectangle(50,50,200,200);
    end.

    Фигуры с заливкой:

    Фигуры с заливкой

    uses GraphABC;
    begin
      Rectangle(50,50,200,200);
      FloodFill(100,100,clBlue);
    end.

    Треугольник рисуется процедурами:

    Line(x1,y1,x2,y2);
    LineTo(x,y);

    треугольник в паскале

    uses GraphABC;
    begin
      setpenwidth(20);
      setpencolor(clred);
      moveTo(300,100);
      lineTo(500,300);
      lineto(100,300);
      lineto(300,100);
      floodfill(300,200,clgreen);
    end.

    Окружность можно нарисовать с помощью процедуры:

  • Circle(x,y,r) — рисует окружность с центром в точке (x,y) и радиусом r.
  • круг в паскале

    uses GraphABC;
    begin
       Circle(500,200,100);
       FloodFill(500,200,clred);
    end.

    Дуга окружности

  • Arc(x,y,r,a1,a2) — Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).
  • Дуга окружности

    1
    2
    3
    4
    5
    
    uses GraphABC;
    Begin
    SetPenWidth(10);
    Arc(300,250,150,45,135);
    end.

    Задание 1: «Лягушка»
    задание по теме графика в паскале

    [Название файла: L4_2task1.pas]

    Задание 2: «Корона»
    задание по теме графика в pascal

    [Название файла: L4_2task2.pas]

    Функция random для использования окраски

  • SetPenColor(rgb(random(256), random(256), random(256))); — выбирает случайное число из 256-цветной палитры для красного, зеленого и синего.
  • Задание 3: Нарисовать горизонтальный ряд окружностей радиусом 10 на расстоянии 100 от верхнего края экрана и с такими горизонтальными координатами 50, 80, 110, 140, … , 290.

    * раскрасить круги случайным цветом

    [Название файла: L4_2task3.pas]

    Задание 4: «Круги на воде».
    Нарисуйте пару десятков концентрических окружностей, то есть окружностей разного радиуса, но имеющих общий центр.

    [Название файла: L4_2task4.pas]

    Задание 5:
    Воспроизвести изображение при помощи программы:
    графика паскаль abc.net

    [Название файла: L4_2task5.pas]

    Штриховка

    Нарисовать штриховку на Паскале можно, используя процедуры рисования прямоугольника и линии:
    алгоритм штриховки на паскале

    Программа будет выглядеть следующим образом:

    1_1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    uses graphABC;
    var i, x1, x2, y1, y2, N: integer;
       h, x: real;
    begin   
      x1 := 100; y1 := 100;
      x2 := 300; y2 := 200;
      N := 10;
      Rectangle (x1, y1, x2, y2);
      h := (x2 - x1) / (N + 1);
      x := x1 + h;
      for i:=1 to N do begin
        Line(round(x), y1, round(x), y2);
        x := x + h;
      end;
    end.

    Задание 6:
    Нарисуйте шахматную доску.

    [Название файла: L4_2task6.pas]

    Анимация в Паскале

    Анимация в программировании заключается в том, что сначала рисуется фигура цветным инструментом, затем с тем же координатами рисуется та же фигура белым цветом. После чего происходит сдвиг фигуры и действия повторяются.

    Пример: Воспроизвести движение круга по горизонтали.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    uses GraphABC;
    var x:integer;
    begin
      x:=40;
    	repeat 
    		SetPenColor(clWhite);
    		Circle(x,100,10);	{Рисуем белую окружность}
    		SetPenColor(clBlack);
    		Circle(x,100,10);	{Рисуем черную окружность}
    		x:=x+1				{Перемещаемся немного направо}
    	until x>600;
    end.

    Задание 7: Выполнить анимацию движения квадрата по следующей траектории:

    [Название файла: L4_2task7.pas]

    Добавить комментарий