Вывести все клетки, которые покрывает заданная окружность - Pascal
Формулировка задачи:
На клеточном поле дана окружность, с центром в середине клетки с координатами (xc; yc) и радиусом r. Нужно вывести координаты всех клеток, которые покрывает заданная окружность.
Пример
Ввод:
2 2 2
Вывод:
0 1
0 2
0 3
1 0
1 1
1 3
1 4
2 0
2 4
3 0
3 1
3 3
3 4
4 1
4 2
4 3
Решение задачи: «Вывести все клетки, которые покрывает заданная окружность»
textual
Листинг программы
- var x1,y1,x2,y2,x3,y3,x4,y4,a,b,c,x,y:integer;
- begin
- repeat
- writeln('Введите координаты клеток с началом и концом отрезка');
- readln(x1,y1,x2,y2);
- until(x1<>x2)or(y1<>y2);//чтобы точки не совпали
- //найдем левый и правый концы по Х
- if x1<x2 then
- begin
- x3:=x1;
- x4:=x2;
- end
- else
- begin
- x3:=x2;
- x4:=x1;
- end;
- //найдем нижний и верхний концы по Y
- if y1<y2 then
- begin
- y3:=y1;
- y4:=y2;
- end
- else
- begin
- y3:=y2;
- y4:=y1;
- end;
- //составим уравнение прямой ay+bx+c=0, вернее определим ее коэффициенты a,b,c
- a:=y2-y1;
- b:=x1-x2;
- c:=x1*(y1-y2)+y1*(x2-x1);
- for x:=x3 to x4 do
- for y:=y3 to y4 do
- //если противоположные вершины по разные стороны от отрезка
- if((a*(x-0.5)+b*(y+0.5)+c)*(a*(x+0.5)+b*(y-0.5)+c)<=0)
- or((a*(x-0.5)+b*(y-0.5)+c)*(a*(x+0.5)+b*(y+0.5)+c)<=0)
- then writeln(x,' ',y);
- end.
Объяснение кода листинга программы
- Объявление переменных:
x1, y1, x2, y2, x3, y3, x4, y4, a, b, c, x, y
- целочисленные переменные.
- Циклический ввод координат:
- Пользователю предлагается ввести координаты клеток с началом и концом отрезка до тех пор, пока точки не станут различными (это проверяется с помощью условия в repeat until).
- Нахождение границ отрезка:
- Определяются левая (x3) и правая (x4) границы отрезка по оси X с помощью условия, сравнивающего x1 и x2.
- Определяются нижняя (y3) и верхняя (y4) границы отрезка по оси Y с помощью условия, сравнивающего y1 и y2.
- Нахождение уравнения прямой:
- Коэффициенты a, b, c уравнения прямой ay+bx+c=0 определяются на основе введенных координат.
- Циклы для проверки клеток:
- Используются два вложенных цикла для прохождения по всем клеткам от x3 до x4 (по оси X) и от y3 до y4 (по оси Y).
- В каждой клетке проверяется, находится ли она по одну сторону отрезка или по другую при помощи условий и, если это так, выводится ее координата x и y.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д