В чем разница между кубической кривой Безье и квадратичной кривой Безье и их варианты использования?

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

Я знаю, что кубический Безье имеет 2 контрольные точки, начальную точку и конечную точку, тогда как квадратичный Безье имеет одну контрольную точку, начальную точку и конечную точку. Однако при рисовании фигур я не могу легко решить, какую из них использовать или когда использовать их вместе.

Как узнать, какой тип кривой использовать в разных точках рисования фигуры?


person Conqueror    schedule 15.09.2013    source источник
comment
Краткое содержание Википедии. В основном это связано с тем, что вы хотите, чтобы ваши изгибы выглядели так. Квадратичные кривые - это конические сечения.   -  person Pointy    schedule 15.09.2013
comment
Судя по названию функции, мне было не сразу очевидно, что bezierCurveTo() предполагается кубической. Я пришел сюда искать разницу между quadraticCurveTo() и bezierCurveTo() :-)   -  person PJ Brunet    schedule 15.04.2020


Ответы (2)


Как вы обнаружили, и квадратичные кривые, и кубические кривые Безье просто соединяют 2 точки кривой.

Поскольку кубическая кривая имеет больше контрольных точек, она более гибкая в выборе пути между этими двумя точками.

Например, вы хотите нарисовать эту букву «R»:

введите описание изображения здесь

Начните рисовать с «неизогнутых» частей буквы R:

введите описание изображения здесь

Теперь попробуйте нарисовать кривую квадратичной кривой.

Обратите внимание, что квадратичная кривая более «острая», чем нам хотелось бы.

Это потому, что у нас есть только одна контрольная точка для определения квадратичной кривизны.

введите описание изображения здесь

Теперь попробуйте нарисовать кривую кубической кривой Безье.

Кубическая кривая Безье более округлая, чем квадратичная.

Это потому, что у нас есть 2 контрольные точки для определения кубической кривизны.

введите описание изображения здесь

Итак ... большее количество контрольных точек дает больший контроль над "извилистостью"

Вот код и скрипт: http://jsfiddle.net/m1erickson/JpXZW/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
    body{ background-color: ivory; padding:20px; }
    #canvas{border:1px solid red;}
</style>

<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    ctx.lineWidth=8;
    ctx.lineCap="round";

    function baseR(){
        ctx.clearRect(0,0,canvas.width,canvas.height);
        ctx.beginPath();
        ctx.moveTo(30,200);
        ctx.lineTo(30,50);
        ctx.lineTo(65,50);
        ctx.moveTo(30,120);
        ctx.lineTo(65,120);
        ctx.lineTo(100,200);
        ctx.strokeStyle="black";
        ctx.stroke()
    }

    function quadR(){
        ctx.beginPath();
        ctx.moveTo(65,50);
        ctx.quadraticCurveTo(130,85,65,120);
        ctx.strokeStyle="red";
        ctx.stroke();
    }

    function cubicR(){
        ctx.beginPath();
        ctx.moveTo(65,50);
        ctx.bezierCurveTo(120,50,120,120,65,120);
        ctx.strokeStyle="red";
        ctx.stroke();
    }

    $("#quad").click(function(){
        baseR();
        quadR();
        //cubicR();
    });

    $("#cubic").click(function(){
        baseR();
        cubicR();
    });

}); // end $(function(){});
</script>

</head>

<body>
    <button id="quad">Use Quadratic curve</button>
    <button id="cubic">Use Cubic Bezier curve</button><br><br>
    <canvas id="canvas" width=150 height=225></canvas>
</body>
</html>
person markE    schedule 15.09.2013
comment
Спасибо, приняли. Есть ли причина использовать квадратичную кривую, если кубическая дает больше гибкости? - person Conqueror; 15.09.2013
comment
Квадратичная кривая математически проще кривой Безье и, следовательно, более эффективна для рисования на холсте. - person markE; 15.09.2013
comment
Кстати, если вы рисуете кривую Безье с одинаковыми двумя контрольными точками, у вас есть квадратичная кривая. Иногда полезно подумать о двух кривых, связанных таким образом. - person markE; 15.09.2013
comment
С точки зрения дизайна, преимущество квадратичных кривых состоит в том, что вы можете моделировать кривую полибезье, используя ярлыки, основанные на том факте, что все точки ограничивают друг друга (это также недостаток, потому что перемещение одной координаты в квадратичной поливизье будет полностью изменить форму). Использование только кривых с контрольными точками, отраженными над точками на кривой, означает, что вам нужна только первая контрольная точка плюс все точки на кривой, что позволяет сэкономить много места при кодировании кривой (так шрифты TrueType моделируют свои контуры) - person Mike 'Pomax' Kamermans; 15.09.2013
comment
@markE Сэр, то, что вы сказали в последнем комментарии, просто неверно! Кубический Безье с одинаковыми контрольными точками не является квадратичным Безье! Фактически, если мы преобразуем квадратичные кривые Безье в кубические, мы получим два разных маркера с разными координатами. А именно, jsfiddle.net/xz1hdmjv См. Этот пример SVG: jsfiddle.net/vkcahL1e - person Max Payne; 02.04.2015

Я так понимаю, что этот пост слишком поздно. Но кажется, что некоторые важные аспекты квадратичных и кубических кривых Безье все еще отсутствуют. Так....

С квадратичной кривой Безье вы никогда не сможете сделать два концевых склона параллельными. Но вы можете добиться этого с помощью кубических кривых Безье. Кроме того, кубические кривые Безье позволяют управлять двумя концевыми наклонами по отдельности, что также невозможно с квадратичной кривой Безье. Однако квадратичная кривая Безье никогда не будет иметь точек перегиба (точки, в которой меняется знак кривизны), в то время как кубическая кривая Безье может иметь точки перегиба, если вы не будете осторожны с контрольными точками. Итак, резюмируя, кубическая кривая Безье гораздо более популярна, чем квадратичная кривая Безье из-за своей гибкости. Квадратичная кривая Безье (чаще рациональные квадратичные кривые Безье) будет использоваться, когда важна монотонная кривизна.

person fang    schedule 09.09.2014
comment
Что, если мы сравним две связанные квадратичные кривые с одной кубической кривой? Разве они не могут достичь такого же уровня гибкости? - person Vektorweg; 02.11.2016
comment
Вы можете повысить уровень гибкости с помощью двух связанных квадратичных кривых. Но это связано с увеличением сложности, так как у вас есть две кривые вместо одной. Кроме того, вы должны убедиться, что эти две кривые всегда связаны касательной непрерывностью. Даже если вы это сделали, эти две кривые могут иметь разрыв кривизны в месте соединения. Таким образом, кубическая кривая по-прежнему является лучшим вариантом, чтобы избежать всех этих проблем. - person fang; 03.11.2016
comment
Что такое монотонная кривизна? - person Scorb; 01.04.2021