2013-09-15 4 views
20

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

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

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

+1

[Wikipedia summary.] (Http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Quadratic_B.C3.A9zier_curves) В основном это связано с тем, что вы хотите, чтобы ваши кривые выглядели. Квадратичные кривые - это конические сечения. – Pointy

ответ

47

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

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

Например, предположим, что вы хотите сделать это письмо «R»:

enter image description here

Начните рисовать с «не-curvey» части R:

enter image description here

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

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

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

enter image description here

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

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

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

enter image description here

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

Вот код и Fiddle: 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> 
+0

спасибо, принятый. Есть ли какая-нибудь причина использовать квадратичную кривую, если кубик обладает большей гибкостью? – Conqueror

+0

Квадратичная кривая математически проще, чем кривая Безье и поэтому более эффективна для рисования холста. – markE

+1

Кстати, если вы нарисуете кривую Безье с двумя контрольными точками, то у вас квадратная кривая. Иногда это помогает думать о двух кривых, связанных таким образом. – markE

0

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

CAD-программы, которые имеют рисунок траектории как функцию, обычно позволяют пользователю нарисовать первый сегмент как кривую, нажав на кнопку мыши & перетащить, а не просто щелкнуть.

Щелчок и перетаскивание позволяет пользователю перетащить первую контрольную точку, где он хочет, и отпустить клик, он позволяет пользователю создавать первый сегмент в виде кривой.

Невозможно нарисовать кубический безье в качестве стартового сегмента, по крайней мере, я еще не видел его.

11

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

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

+1

Что делать, если мы сравним две связанные квадратичные кривые с одной кубической кривой? Разве они не могут достичь такого же уровня гибкости? – Vektorweg

+3

Вы можете увеличить уровень гибкости с помощью двух связанных квадратичных кривых. Но это связано с ценой повышенной сложности, поскольку у вас есть две кривые вместо одной. Кроме того, вы должны убедиться, что эти две кривые всегда связаны с касательной непрерывностью. Даже если вы это сделали, у этих двух кривых, вероятно, будет разрыв кривизны в соединении. Таким образом, кубическая кривая по-прежнему является лучшей ставкой, чтобы избежать всех этих проблем. – fang