Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 21 ноя 2017, 15:56

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: 26 авг 2016, 19:03 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
Оптимизированный по скорости вариант. Используются предварительно рассчитанные таблицы синуса/косинуса.
AzAtom писал(а):
Заполнение таблицы немного хитрое, берутся градусы с шагом в 10 и промежутки заполняются просто усреднёнными значениями. Так на бейсике было чуть быстрее, а точность не страдала.
Код: "OBERON"
  1. (* Spiral on the ball (Pascal/Fast, UK-NC) for ZXDev/Oberon-2 *)
  2. (* Copyright (C) 1996 AzAtom *)
  3. (* http:// azatom.narod.ru, http:// zx-pk.ru/forum.php *)
  4.  
  5. MODULE Spiral11;
  6. IMPORT Basic, G := GrPixel, Math;
  7.  
  8. CONST
  9. cx = 128; cy = 88;
  10. R = 80; (* Radius. Can be changed from 1 to 88 *)
  11. A = 30; (* Angle. Can be changed from 0 to 90 *)
  12. V = 20; (* Number of turns. Can be changed from 1 to .. *)
  13.  
  14. VAR
  15. i, x, y: INTEGER; yr1, yr2: REAL; Sina, Cosa: ARRAY 361 OF REAL;
  16.  
  17. PROCEDURE PrepareTables;
  18. VAR
  19. i, q: SHORTINT;
  20. BEGIN
  21. (* Подготовка массива синусов и косинусов *)
  22. Sina[0] := Math.Sin(0); Cosa[0] := Math.Cos(0);
  23. G.PutPixel(37, 0); G.PutPixel(37, 1); G.PutPixel(37, 2); G.PutPixel(0, 0);
  24. FOR i := 1 TO 36 DO
  25. yr1 := i * 3.1416 / 18;
  26. Sina[i*10] := Math.Sin(yr1); Cosa[i*10] := Math.Cos(yr1);
  27. yr1 := (Sina[i*10] - Sina[(i-1) * 10]) / 10;
  28. yr2 := (Cosa[i*10] - Cosa[(i-1) * 10]) / 10;
  29. FOR q := 1 TO 9 DO
  30. Sina[(i-1)*10 + q] := Sina[(i-1)*10] + yr1*q;
  31. Cosa[(i-1)*10 + q] := Cosa[(i-1)*10] + yr2*q;
  32. END;
  33. G.PutPixel(i, 0);
  34. END;
  35. END PrepareTables;
  36.  
  37. BEGIN (*$MAIN*)
  38. Basic.Init; Basic.CLS;
  39. PrepareTables; Basic.CLS;
  40.  
  41. yr1 := R * Sina[A]; (* Размах по y *)
  42. yr2 := R * Cosa[A]; (* Начало по y *)
  43. i := V * 36;
  44. REPEAT
  45. (* Когда i дойдёт до V*36, первый косинус должен V раз дойти до 360. *)
  46. (* Когда i дойдёт до V*36, второй синус должен дойти до 180. *)
  47. G.PutPixel(
  48. cx + SHORT(ENTIER(R*Cosa[(i*10) MOD 360]*Sina[(i*5) DIV V])),
  49. (* Когда i дойдёт до V*36, первый синус должен v раз дойти до 360. *)
  50. (* Когда i дойдёт до V*36, второй синус должен дойти до 180. *)
  51. (* Когда i дойдёт до V*36, третий косинус должен дойти до 180. *)
  52. cy + SHORT(ENTIER(yr1*Sina[(i*10) MOD 360]*Sina[(i*5) DIV V]
  53. - yr2*Cosa[(i*5) DIV V]))
  54. );
  55. DEC(i);
  56. UNTIL i < 0;
  57.  
  58. Basic.PAUSE(0);
  59. Basic.Quit
  60. END Spiral11.


Вложения:
Spiral11.zip [4.2 КБ]
Скачиваний: 58
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 02 сен 2016, 04:53 
Не в сети
Аватара пользователя

Сообщения: 843
Откуда: Днепропетровская обл.
Целочисленный вариант спирали. Рисуется моментально. :-)
Благодарю AzAtom за интересный результат. Добавлю в примеры.


Вложения:
Spiral11f3.zip [2.57 КБ]
Скачиваний: 56
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Тех.поддержка phpBB