- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
#include <iostream>
using namespace std;
void Brezenhem(char **z, int x0, int y0, int x1, int y1)
{
int A, B, sign;
A = y1 - y0;
B = x0 - x1;
if (abs(A) > abs(B)) sign = 1;
else sign = -1;
int signa, signb;
if (A < 0) signa = -1;
else signa = 1;
if (B < 0) signb = -1;
else signb = 1;
int f = 0;
z[y0][x0] = '*';
int x = x0, y = y0;
if (sign == -1)
{
do {
f += A*signa;
if (f > 0)
{
f -= B*signb;
y += signa;
}
x -= signb;
z[y][x] = '*';
} while (x != x1 || y != y1);
}
else
{
do {
f += B*signb;
if (f > 0) {
f -= A*signa;
x -= signb;
}
y += signa;
z[y][x] = '*';
} while (x != x1 || y != y1);
}
}
int main()
{
const int SIZE = 25; // размер поля
int x1, x2, y1, y2;
char **z;
z = new char*[SIZE];
for (int i = 0; i < SIZE; i++)
{
z[i] = new char[SIZE];
for (int j = 0; j < SIZE; j++)
z[i][j] = '-';
}
cout << "x1 = "; cin >> x1;
cout << "y1 = "; cin >> y1;
cout << "x2 = "; cin >> x2;
cout << "y2 = "; cin >> y2;
Brezenhem(z, x1, y1, x2, y2);
for (int i = 0; i < SIZE; i++)
{
for (int j = 0; j < SIZE; j++)
cout << z[i][j];
cout << endl;
}
cin.get(); cin.get();
return 0;
}
bormand 05.02.2022 03:54 # 0
JloJle4Ka 05.02.2022 06:09 # 0
Запостил: digitalEugene
ObeseYoung 06.02.2022 01:20 # 0
bormand 05.02.2022 09:01 # +1
А идея алгоритма вроде норм освоена.
JloJle4Ka 05.02.2022 09:06 # 0
И вообще, лучше этот код переписать на «Nim».
bormand 05.02.2022 09:07 # 0
JloJle4Ka 05.02.2022 09:10 # 0
Floating_cockerel 05.02.2022 18:00 # 0
ISO 05.02.2022 19:23 # 0
Naf-Naf 05.02.2022 20:05 # 0
Floating_cockerel 06.02.2022 07:39 # 0
Floating_cockerel 05.02.2022 18:00 # 0
guest6 05.02.2022 22:44 # 0
Ты заранее статически знаешь размер, и он равен 25. Даже если ты пишешь по 8086, тебе хватит стека.
guest6 05.02.2022 22:35 # 0
бо нехуй студентам давать кресты
Алгоритмы надо учить на чистой сишке.
digitalEugene 06.02.2022 00:37 # 0
ISO 05.02.2022 11:07 # +2
Поздравляю, digitalEugene!
JloJle4Ka 05.02.2022 11:21 # 0
CHayT 05.02.2022 14:11 # +4
Привет, сестрёнка!
Floating_cockerel 05.02.2022 17:47 # 0
PolinaAksenova 05.02.2022 17:54 # +1
Ня! (─‿‿─)
Floating_cockerel 05.02.2022 17:58 # 0
Floating_cockerel 05.02.2022 18:34 # +1
https://ideone.com/Ndovg3
Кодстайл соблядён.
Floating_cockerel 05.02.2022 18:37 # +1
Hu3KoypoBHeBblunemyx 05.02.2022 19:00 # 0
> void Brezenhem(int size, char z[][size], int x0, int y0, int x1, int y1)
Именно поэтому я за "Си"
bormand 05.02.2022 19:07 # 0
Hu3KoypoBHeBblunemyx 05.02.2022 19:24 # 0
Hu3KoypoBHeBblunemyx 05.02.2022 19:29 # 0
Naf-Naf 05.02.2022 20:16 # 0
Naf-Naf 05.02.2022 20:24 # 0
guest6 05.02.2022 19:26 # +2
Naf-Naf 05.02.2022 20:10 # 0
bormand 05.02.2022 20:15 # 0
Naf-Naf 05.02.2022 20:20 # 0
Я вспомнил «Бейсик» на «Агате», в котором не было оператора CIRCLE, и окружность приходилось реализовывать самому. А синус эта гадость вычисляла невыносимо медленно, поэтому итерироваться по углу было нельзя.
bormand 06.02.2022 00:39 # +1
Floating_cockerel 06.02.2022 07:01 # 0
Floating_cockerel 06.02.2022 07:01 # 0
bormand 06.02.2022 00:53 # +1
Ну представь как вычислять разложение в ряд (!) когда у тебя нету фпу (!), нету умножения (!) и даже складывать мантиссу приходится восьмибитными кусочками (!).
Я помню у меня калькулятор тоже задумывался над синусами.
bormand 06.02.2022 00:55 # 0
CORDIC или как там его.
Fike 06.02.2022 01:32 # 0
guest6 06.02.2022 05:07 # 0
Naf-Naf 06.02.2022 07:05 # 0
Умножение и деление даже целых питухов разработчикам Бейсика пришлось пилить самостоятельно.
А реализация плавающего — целое искусство.
Регистры:
A — аккумулятор, 8 бит;
X, Y — индексные регистры, 8 бит;
PC — счетчик команд, 16 бит;
S — указатель стека, 8 бит;
P — регистр состояния;
Пи здесь.
Naf-Naf 06.02.2022 08:27 # 0
Машинные регистры обычно четырёхбитные. Но их не видно даже на программируемых микрокалькуляторах. Их от пользователя скрывает микрокод.
Аккумулятор X (который прибит к экрану) и «стековые регистры» — это, по всей вероятности, массивы из четырёхбитовых ячеек. То есть микрокод собирает из массива ячеек «макрорегистр».
Числа обычно представлены как BCD. Одна четырёхбитовая ячейка — одна десятичная цифра. То есть на 8-разрядном микрокалькуляторе один «макрорегистр» состоит из восьми четырёхбитовых ячеек под мантиссу + несколько ячеек для хранения порядка и знака. При выводе на экран конвертировать число не нужно, представление уже готово. Ну почти готово. Нужно проверить порядок, если он небольшой, то вывести только мантиссу с нужным положением запятой, а если порядок огромный, то поставить запятую после первого знака мантиссы и вывести порядок.
Погуглил...
«Одно число с 8-разрядной мантиссой и 2-х разрядным порядком занимает 14 тетрад»
Всё ещё интереснее:
https://m.vk.com/@thntofff-vnedrenie-v-arhitekturu-sovetskih-programmiruemyh-kalkulyato
Четырёхбитовые ячейки являются частью гигантского регистра.
У некоторых микрокалькуляторов тригонометрию вычисляет отдельный сопроцессор, сидящий на той же шине, с собственным микрокодом.
Naf-Naf 06.02.2022 08:29 # 0
Для восьмиразрядного калькулятора хватит четырёх слагаемых формулы Тейлора. Пятое слагаемое уже выйдет за пределы разрядности.
bormand 06.02.2022 08:31 # 0
Naf-Naf 06.02.2022 08:33 # 0
bormand 06.02.2022 08:47 # +1
bormand 06.02.2022 08:47 # +1
Naf-Naf 06.02.2022 08:50 # 0
Возможно, реализации каких-то частных случаев я уже видел...
Naf-Naf 06.02.2022 08:57 # +1
j123123 06.02.2022 02:06 # +2
Для этой задачи синус нахуй не нужен
https://wandbox.org/permlink/41wG3PdPotIwauSt
Ну и да, можно по формуле y = sqrt((a-x)^2+(b-y)^2) найти кучу точек, и их соединить отрезками через брезенхейм
j123123 06.02.2022 02:14 # +2
Naf-Naf 06.02.2022 06:55 # 0
Про обход по двум координатам не думал. Интересно. Квадрат считается быстрее корня. Хотя на больших размерах уже наверное будет не очень быстро.
Ещё есть вариант через дифференциальные уравнения:
(x - a)dx + (y - b)dy = 0. Но тут будут накапливаться погрешности и результат может оказаться заметно неровным.
3.14159265 06.02.2022 09:43 # 0
Для заполенного круга они не нужны.
А для незаполненного там тоже есть итеративный алгоритм без корней.
Floating_cockerel 06.02.2022 10:22 # 0
j123123 19.03.2024 14:09 # 0
https://wandbox.org/permlink/gxZwbszixkUAiBJF вот так
j123123 06.02.2022 20:09 # 0
Смотря как он реализован. Если у тебя процессор без инструкций умножения, и если квадрат и корень реализован тупой таблицей поиска, считаться они будут одинаково по времени. Хотя корень может даже быстрее считаться, учитывая что под квадрат надо в два раза больше бит под результат
А если специальной таблицы поиска для квадратных корней нет, но есть таблица поиска для квадратов, для нахождения квадратного корня можно по ней ебнуть двоичным поиском, это конечно будет медленней
bormand 06.02.2022 20:29 # 0
j123123 06.02.2022 22:22 # 0
>> под квадрат надо в два раза больше бит под результат
> А под корень надо в два раза больше строчек в таблице.
Смотря с какой точностью какой интервал. Таблицу квадратов и корней еще можно всякими хитровыебаными методами зожимать. Можно еще воспользоваться формулой sqrt(a*b) = sqrt(a)*sqrt(b) из которой вытекает sqrt(a*2^(2*b)) = (2^b)*sqrt(a)
ну т.е. если надо посчитать квадратный корень из 70, используя инты, но получить сколько-то знаков после запятой, можно посчитать квадратный корень из 70 * pow(2, 2*n), и тогда будет n знаков после запятой
bormand 06.02.2022 22:26 # 0
З.Ы. Блин, мы так CORDIC изобретём скоро.
Naf-Naf 06.02.2022 07:37 # 0
Можно тупее: соединить вертикальными отрезками зеркальные точки:
y1 = b + sqrt(r^2 - (x-a)^2)
и
y2 = b - sqrt(r^2 - (x- a)^2)
Получим залитый круг.
А если нужна окружность, сверху наложить круг чуть поменьше.
Вот если нужно сохранять фон, тогда сложнее. Хотя всё равно брезенхейм не нужен. Просто берём единицу в качестве шага по x.
bormand 06.02.2022 08:14 # +2
Да там можно напрямую брезенхеймить. Алгоритм то довольно универсальный, любую f(x, y) = 0 можно обводить если получается быстро вычислить значение f в соседних точках.
guest6 05.02.2022 22:28 # +1
хуй знает что можно написать на uses graph;
Поле чудес?
bormand 05.02.2022 22:48 # +1
Soul_re@ver 06.02.2022 01:17 # +1
bormand 06.02.2022 01:18 # 0
Хотя вроде был реально текстовый режим для игры по ssh.
Floating_cockerel 06.02.2022 06:59 # 0
Правда не на 486-м, но мне кажется и на нём бы не тормозило.
Naf-Naf 06.02.2022 07:24 # 0
Шутер от первого лица а ля Дум, где нужно весь кадр перерисовывать, на uses graph не сделаешь, а вот игры с неподвижным фоном — вполне.
Naf-Naf 06.02.2022 07:30 # +2
Naf-Naf 05.02.2022 23:05 # +2
https://youtu.be/ZcbJEhE8dFY
ObeseYoung 06.02.2022 01:09 # 0
ObeseYoung 06.02.2022 01:18 # 0
Naf-Naf 05.02.2022 20:15 # 0
Елена Вставская (Константинова), 1978-го года издания, Челябинск, доцент ЮУрГУ, замужем?
guest6 05.02.2022 22:25 # 0
Naf-Naf 05.02.2022 23:01 # 0
https://sun9-29.userapi.com/sun9-17/IkiB_1wb_xMyPNzfuEYErf0svk_Y9JhT_e3n1Q/2ajObcm_i5g.jpg
guest6 06.02.2022 05:35 # 0
Ну с другой стороны, они уже замужем, ей уже всё равно.
Считается, что крупные свиньи при сбалансированном питании и комфортной жизни запросто проживут порядка 35 лет.
Naf-Naf 06.02.2022 06:46 # 0
https://sun9-29.userapi.com/sun9-85/sN3BcKYVeadxDN7_oF6W4EWHBzP3PcvMdkomHg/6iAGqG6-PHE.jpg
Но в целом вызывает ощущение типичного программиста.
guest6 07.02.2022 01:41 # +1
Современный типичный программист имеет синие волосы, зеленую тату, оранжевые шорты, и макбук со смузи
Naf-Naf 07.02.2022 04:42 # 0
bormand 07.02.2022 10:11 # 0
digitalEugene 14.02.2022 10:35 # 0
Rooster 14.02.2022 10:36 # 0
OMuKPOH 14.02.2022 20:45 # 0
digitalEugene 05.02.2022 20:36 # 0
digitalEugene 06.02.2022 00:42 # 0
Спасибо, Елена, за понятное объяснение и элегантный код, очень всё упаковано, а ведь есть 8 вариантов знаков и отношений модулей A и B.
и это явно не троллинг. судя по всему это те самые программисты по блок-схемам.
ObeseYoung 06.02.2022 01:37 # 0
Fike 06.02.2022 01:38 # 0
Naf-Naf 06.02.2022 13:19 # 0
digitalEugene 06.02.2022 13:59 # 0
Floating_cockerel 06.02.2022 15:58 # 0
Fike 07.02.2022 01:25 # 0
bormand 07.02.2022 01:34 # −1
guest6 07.02.2022 01:40 # 0
bormand 07.02.2022 01:41 # 0
guest6 07.02.2022 01:45 # 0
я думал гост
bormand 07.02.2022 01:50 # 0
Fike 07.02.2022 02:42 # 0
https://govnokod.ru/27605#comment660997
ObeseYoung 07.02.2022 03:11 # 0
guest6 07.02.2022 03:51 # 0