Редактирование: Суперэллипс и суперпарабола

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 2: Строка 2:
  
  
Суперэллипс и суперпарабола — кривые, обобщающие понятие эллипса и параболы на произвольную положительную степень. Ниже приведены простейшие интерактивные графики этих кривых ''(перемещение слайдера меняет показатель степени).''
+
Суперэллипс и суперпарабола — кривые, обобщающие понятие эллипса параболы на произвольную положительную степень. Ниже приведены простейшие интерактивные графики этих кривых ''(перемещение слайдера меняет показатель степени).''
 
 
 
 
<htmlet nocache="yes">Krivtsov/SEP_TM</htmlet>
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''Текст программы построения графиков на языке JavaScript:''' <div class="mw-collapsible-content">
 
Файл '''"SEP.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
// Суперэллипс и суперпарабола
 
// Superellipse & superparabola (SEP)
 
// Разработчики А.М. Кривцов и Д.В. Цветков
 
// 03.05.2014
 
// 15.05.2014 коррекция для совместимости с Google Chrome
 
// 06.11.2014 коррекция - удаление const (Цветков)
 
// Интернет: tm.spbstu.ru/SEP
 
 
 
function MainSEP(canvas, Slider_01, Text_01) {
 
 
 
    // Предварительные установки
 
 
 
    var context = canvas.getContext("2d");  // на context происходит рисование
 
 
 
    // Задаваемые параметры
 
 
 
var n = 2;
 
    var fps = 50;                        // f rames per second - число кадров в секунду (качество отображения)
 
 
 
    // Область построения графика
 
    var x_min = -2; 
 
    var x_max = -x_min;
 
    var y_min = x_min;   
 
    var y_max = -x_min;   
 
     
 
    // Настройка элементов управления
 
    Slider_01.min = 0.1;      // лучше было бы взять Slider_01.min = b, но b не кратно значению Slider_01.step, что портит слайдер
 
    Slider_01.max = 10;
 
    Slider_01.step = 0.1;
 
    Slider_01.value = n;    // значение ползунка должно задаваться после min, max и step
 
    Text_01.value = n;
 
var parabola_flag = true;
 
var ellipse_flag = true;
 
 
 
    // Функции, запускающиеся при изменении элементов управления
 
    this.setSlider_01 = function(input) { n = input; draw(); } // input - значение на слайдере
 
    this.setCheckbox_01 = function(bool) {parabola_flag = bool; draw(); }
 
this.setCheckbox_02 = function(bool) {ellipse_flag = bool; draw(); }
 
   
 
  // Расчет параметров графики
 
   
 
    var N = canvas.width;                // число точек по оси x
 
    var dx = x_max / N;                  // шаг по оси x
 
    var sx = canvas.width / (x_max - x_min);  // масштаб по оси x
 
    var sy = canvas.height / (y_max - y_min); // масштаб по оси y
 
    var X0 = canvas.width + x_min * sx;  // положение 0 оси x в экранных координатах
 
    var Y0 = canvas.height + y_min * sy;  // положение 0 оси y в экранных координатах
 
 
 
draw(); // Отображение
 
 
 
    function draw()
 
    {
 
context.clearRect(0, 0, canvas.width, canvas.height);          // очистить экран
 
       
 
        // Горизонтальная ось
 
        context.strokeStyle = 'lightgrey';
 
        context.beginPath();
 
        context.moveTo(0, Y0);
 
        context.lineTo(canvas.width, Y0);
 
        context.moveTo(X0, 0);
 
        context.lineTo(X0, canvas.height);
 
        context.stroke();
 
 
 
        // Надписи
 
        context.fillStyle = 'black';
 
        context.font = "20px Times";
 
        context.fillText("0", X0 + 3, Y0 + 20);
 
        context.fillText("1", X0 + 1 * sx + 4, Y0 + 20);
 
        context.fillText("1", X0 + 5, Y0 - 1 * sy - 4);
 
        context.font = "italic 20px Times";
 
        context.fillText("x", canvas.width - 14, Y0 + 20);
 
        context.fillText("y", X0 + 7, 15);
 
 
 
        // График y = x^n
 
        context.strokeStyle = 'black';
 
        context.beginPath();
 
if (parabola_flag)
 
for (var x = x_min; x < x_max; x += dx)
 
        {
 
            var y = Math.pow(Math.abs(x), n);
 
   
 
            var X = X0 + x * sx;           
 
            var Y = Y0 - y * sy;
 
 
 
            if (x == x_min) context.moveTo(X, Y);
 
            else            context.lineTo(X, Y);
 
        }
 
        context.stroke();
 
 
 
        // График x^n + y^n = 1
 
        context.strokeStyle = 'red';
 
        context.beginPath();
 
if (ellipse_flag)       
 
for (var t = 0; t < 2 * Math.PI; t += Math.PI / 180)
 
        {
 
            var x = Sign(Math.cos(t)) * Math.pow(Math.abs(Math.cos(t)), 2/n);
 
            var y = Sign(Math.sin(t)) * Math.pow(Math.abs(Math.sin(t)), 2/n);
 
   
 
            var X = X0 + x * sx;           
 
            var Y = Y0 - y * sy;
 
 
 
            if (t == 0) context.moveTo(X, Y);
 
            else        context.lineTo(X, Y);
 
        }
 
        context.stroke();
 
    }
 
   
 
// Сигнум числа
 
// Функция Math.sign пока не поддерживается Google Chrome
 
function Sign(x)
 
    {
 
        if (x > 0) return 1;
 
        if (x < 0) return -1;
 
        return 0;
 
    }
 
}
 
</syntaxhighlight>
 
Файл '''"SEP.html"'''
 
<syntaxhighlight lang="html5" line start="1" enclose="div">
 
<!DOCTYPE html>
 
<html>
 
<head>
 
    <meta charset="UTF-8" />
 
    <title>Super Ellipse</title>
 
    <script src="SEP.js"></script>
 
</head>
 
<body>
 
<!--Графическое поле-->
 
<canvas id="canvasGraph" width="600" height="600" style="border:1px solid #000000;"></canvas>
 
 
 
<!--Чекбоксы-->
 
<div>
 
        <font color="#000000" size="5"><B>—</B></font>
 
<input type="checkbox" id="checkbox_01" name="" onchange="app.setCheckbox_01(this.checked);" checked/>Суперпарабола:
 
<I>y = |x|<SUP>n</SUP></I>
 
<BR>
 
        <font color="#ff0000" size="5"><B>—</B></font>
 
<input type="checkbox" id="checkbox_02" name="" onchange="app.setCheckbox_02(this.checked);" checked/>Суперэллипс:
 
<I>|x|<SUP>n</SUP> + |y|<SUP>n</SUP></I> = 1<BR>
 
    </div>
 
   
 
<!--Слайдер-->
 
    <div>Степень:
 
        <input type="range" id="Slider_01" style="width: 150px;" oninput="app.setSlider_01(this.value); document.getElementById('Text_01').value = this.value;">
 
        <I>n</I> =
 
        <input id="Text_01" style="width: 3ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
 
            // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
 
            if (!this.checkValidity()) return;
 
            app.setSlider_01(this.value);
 
            document.getElementById('Slider_01').value = this.value;
 
        ">
 
    </div>
 
    <br>
 
 
<!--Запуск приложения-->   
 
    <script type="text/javascript">var app = new MainSEP(
 
document.getElementById('canvasGraph'),
 
        document.getElementById('Slider_01'),
 
document.getElementById('Text_01')
 
); </script>
 
</body>
 
</html>
 
</syntaxhighlight>
 
</div>
 
</div>
 
  
 +
<addscript src=SEP/>
 +
<htmlet nocache="yes">SEP_TM</htmlet>
  
 
== Частные случаи суперэллипса ==
 
== Частные случаи суперэллипса ==
Строка 194: Строка 23:
 
|<math>2</math> || окружность (эллипс)
 
|<math>2</math> || окружность (эллипс)
 
|-align="center"
 
|-align="center"
|<math>4</math> || квадрокруг ([http://en.wikipedia.org/wiki/Squircle squircle])
+
|<math>4</math> || сквиркл ([http://en.wikipedia.org/wiki/Squircle squircle])
 
|-align="center"
 
|-align="center"
 
|<math>\infty</math> || квадрат (прямоугольник)
 
|<math>\infty</math> || квадрат (прямоугольник)
Строка 203: Строка 32:
 
* [http://ru.wikipedia.org/wiki/%D0%A1%D1%83%D0%BF%D0%B5%D1%80%D1%8D%D0%BB%D0%BB%D0%B8%D0%BF%D1%81 Суперэллипс] (Википедия)
 
* [http://ru.wikipedia.org/wiki/%D0%A1%D1%83%D0%BF%D0%B5%D1%80%D1%8D%D0%BB%D0%BB%D0%B8%D0%BF%D1%81 Суперэллипс] (Википедия)
 
* [http://en.wikipedia.org/w/index.php?title=Lp_space&action=edit L<sup>''p''</sup> space] (Wikipedia)
 
* [http://en.wikipedia.org/w/index.php?title=Lp_space&action=edit L<sup>''p''</sup> space] (Wikipedia)
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Программирование]]
 
[[Category: JavaScript]]
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)