我是新手,有一个问题,我想画一个程序,在其中有一个bicorn曲线,并且每当鼠标在曲线上时,它都可以生成切线,所以在无限点上,但是现在我只有静态图形,但是由于鼠标移动,我不知道如何在曲线上生成切线……
这是我现在拥有的全部
void draw(){
background(0);
translate(width/2, height/2);
noFill();
stroke(255);
beginShape();
for(float a=0; a < TWO_PI; a+=0.01) {
float r=200;
float x=(r)*sin (a);
float y=(-r)*(pow(cos(a),2)/(2-cos(a)));
vertex(x,y);
}
endShape();
}
我的想法是创建一个光标,该光标通过曲线移动,并且生成的每个tima都是自己的切线。
非常感谢!!!
我建议使用PVector
进行计算。
创建一个计算形状上的点的函数:
PVector
您必须在形状上找到最接近鼠标位置的点。绘制形状时找到最近的点。注意,由于形状是平移的,用于将鼠标位置与形状上的点进行比较的鼠标位置必须沿相反方向移动:
PVector fSahpe(float a) {
float r = 200;
float x = r * sin(a);
float y = -r *(pow(cos(a),2)/(2-cos(a)));
return new PVector(x, y);
}
PVector m = new PVector(mouseX-width/2, mouseY-height/2);
可用于计算2点之间的dist()
:
dist()
定义阈值距离。如果鼠标到曲线上最接近点的距离小于该距离,则绘制切线:
Euclidean distance
计算曲线上的两个相互靠近的点,其中一个点是最接近鼠标光标的点:
float mindist = 1000;
float mina = 0;
for(float a=0; a < TWO_PI; a+=0.01) {
PVector p = fSahpe(a);
// [...]
float dist = PVector.dist(p, m);
if (dist < mindist) {
mindist = dist;
mina = a;
}
}
[这2点指向近似切线。从点到另一点计算向量,并将其缩放到一定长度(长度是切线的一半长度):
if (mindist < 10) {
// [...] draw tangent
}
计算切线的起点和终点:
PVector p0 = fSahpe(mina);
PVector p1 = fSahpe(mina+0.01);
请参阅完整的示例:
PVector dir = PVector.sub(p1, p0);
dir.normalize().mult(100);
PVector l0 = PVector.add(p0, dir);
PVector l1 = PVector.sub(p0, dir);