Как изменить режим угла в processing.js?

Khan Academy processing.js использует градусы по умолчанию для значений углов, но вы можете изменить его, выполнив следующие действия:

angleMode("radians");

Processing.js использует радианы по умолчанию, но в документации упоминается режим угла (здесь как параметр функции поворота):

угловой поплавок: угол поворота, указанный в радианах или градусах в зависимости от текущего режима угла

Но я не нашел функцию, чтобы изменить его. Сам код функции поворота предполагает, что режима градусов нет:

Drawing2D.prototype.rotate = function(angleInRadians) {
  modelView.rotateZ(angleInRadians);
  modelViewInv.invRotateZ(angleInRadians);
  curContext.rotate(angleInRadians);
};

Есть ли способ изменить режим угла?


person Michael    schedule 19.10.2015    source источник
comment
Да. Я перезаписываю функцию Академии Хана перед with(processing): var rotateFn = processing.rotate; processing.rotate = функция (угол) { rotateFn (processing.radians (угол)); } Вам нравится полный код?   -  person Michael    schedule 23.09.2016
comment
Мне не нужно видеть полный код, но этот вопрос по-прежнему помечен как требующий ответа, поэтому я хотел уточнить у вас, нужна ли вам помощь.   -  person Kevin Workman    schedule 23.09.2016
comment
Я написал ответ ;-)   -  person Michael    schedule 24.09.2016


Ответы (3)


В самом коде Khan processing.js (pjs) нет возможности изменить режим. Поэтому вам нужно преобразовать значения, как написал Рави Шарма в своем ответе.

Поскольку я не хотел этого делать, чтобы использовать оригинальные программы Khan, поскольку они должны работать в обычных средах processing.js / web, вот что я сделал:

(Это не только преобразование градусов в радианы, но и ввод с помощью мыши и клавиатуры)

var canvas = document.getElementById("canvas");                                                                                                                                                                                                                                                                         
var processing = new Processing(canvas, function(processing) {
    processing.size(400, 400);
    processing.background(0,0,0,0);
    processing.sbShow = false;

    var mouseIsPressed = false;
    $(".container").on("mousedown touchstart", function(e) {
        mouseIsPressed = true;
        processing.mouseX = e.pageX;
        processing.mouseY = e.pageY;
        processing.sbShow = false;
    }).on("mouseup touchend", function(e) {
        mouseIsPressed = false;
        processing.mouseX = e.pageX;
        processing.mouseY = e.pageY;
    }).on("mousemove touchmove", function(e) {
        processing.mouseX = e.pageX;
        processing.mouseY = e.pageY;
    });
    processing.mousePressed = function () { mouseIsPressed = true; };
    processing.mouseReleased = function () { mouseIsPressed = false; };

    var keyIsPressed = false;
    processing.keyPressed = function () { keyIsPressed = true; };
    processing.keyReleased = function () { keyIsPressed = false; };

    function getSound(s) {
        var url = "sounds/" + s + ".mp3";
        return new Audio(url);
    }

    function playSound(s) {
        s.play();
    }

    function getImage(s) {
        var url = "img/" + s + ".png";
        //processing.externals.sketch.imageCache.add(url);
        return processing.loadImage(url);
    }

    var rotateFn = processing.rotate;
    processing.rotate = function(angle) {
        rotateFn(processing.radians(angle));
    }
    var cosFn = processing.cos;
    processing.cos = function(angle) {
        return cosFn(processing.radians(angle));
    }
    var sinFn = processing.sin;
    processing.sin = function(angle) {
        return sinFn(processing.radians(angle));
    }

    with (processing) {
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    // Insert original Khan academy pjs code (default is degrees) ...

    /////////////////////////////////////////////////////////////////////////////////////////////
    };

    if (typeof draw !== 'undefined') processing.draw = draw;
});

Примечание. Это не является полным. Не хватает преобразований для tan, atan, atan2 и т. д.

person Michael    schedule 24.09.2016
comment
У вас есть это на github? Я использую что-то похожее, и у меня нет навыков, чтобы заполнить остальные недостающие функции. - person thinsoldier; 25.09.2016
comment
На самом деле я думаю, что код, который я использую, изначально был скопирован у вас. - person thinsoldier; 25.09.2016
comment
Нет, у меня еще нет его на github. Но я использую его на одном из своих веб-сайтов: c2064.org/spielplatz (Просто зайдите в Галерею, и у вас есть несколько примеров — щелкните один, затем щелкните правой кнопкой мыши, чтобы показать источник). Это одностраничные реализации. Убедитесь, что вы изменили все ссылки, которые ссылаются на что-то с c2064.org. - person Michael; 26.09.2016
comment
Спасибо. Я посмотрю, чему смогу научиться у вас, и добавлю это к себе: github.com /thinsoldier/khanacademyJS/коммит/мастер/ - person thinsoldier; 28.09.2016
comment
Выглядит хорошо. Я уверен, что я почерпну из этого некоторые идеи ... :-) - person Michael; 28.09.2016

Где вы читаете, что его можно изменить? Это будет старая документация, которую нам нужно исправить.

Используйте функции радианы() и градусы() для преобразования. Например:

Код:

// Get the sine of 90 degrees
float s = sin(radians(90));
person Ravi Sharma    schedule 19.10.2015
comment
Здесь: processingjs.org/reference/rotate_ Параметры angle float: угол поворота указывается в радианах или градусах. в зависимости от текущего режима угла - person Michael; 19.10.2015
comment
Мне нужна была бы такая функция, чтобы программы, написанные для живого редактора KA, легко переносились в processing.js. В противном случае мне пришлось бы использовать радианы в Академии Хана, что может быть менее прозрачно для новичков. - person Michael; 19.10.2015

Это хороший вопрос, и я немного почесал голову. Но из того, что я могу сказать, это просто опечатка в ссылке. Стандартный Processing.js не имеет функции angleMode. Это легко проверить, нажав ctrl+f в исходный код.

Итак, почему это в ссылке? Функция angleMode появляется в двух местах:

  • p5.js имеет угловой режим. Это похоже на Processing.js, только тяжелее на стороне JavaScript.
  • Khan Academy имеет angleMode. Похоже, они добавили его поверх стандартного Processing.js.

Я предполагаю, что у Khan Academy и Processing.js есть общие корни разработки. Над обоими работал Джон Резиг. Так что некоторая часть исходного кода (и документации), вероятно, была копией-вставкой. В какой-то момент angleMode был включен в документацию, но не в исходники.

Вы можете отправить сообщение об этом на веб-сайте Processing.js GitHub.

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

void setup(){
   angleMode = "radians";
}

Тогда любой код, который вы оттуда возьмете, будет совместим со стандартным Processing.js, за исключением этой строки angleMode.

person Kevin Workman    schedule 27.10.2015