我试图找到两条线的相对线的交点:
df.prices.apply(pd.Series)
但是我对于找到线的对立感到非常困惑。
这里是jsfiddle,其点数在0.0-1.0之间转换
那么如何找到那个路口?
答案 0 :(得分:3)
我已经很自由地清理了一下代码并添加了一些对象,以使数据的收集变得更加容易。已添加:Point
,Line
对象和两个对象上的关联方法draw()
。
为此,您首先需要计算中点。这很容易,您的直线上有点(a,b)
和(c,d)
,中点是( (a+c)/2, (b+d)/2 )
。这就是您的相反线的起点。
从那里,您可以通过获取直线(grad = (d-b)/(a-c)
)的斜率并计算出-1/grad
(因为垂直线具有相反的斜率)来计算相反的斜率。这是我定义的opposite()
函数。
从这里开始,您有两条相反的线,只需要找到相交点即可。您对这两条线都有两个方程式(因为您知道一条线为y = g*x + r
,其中g
是渐变,r
是原点的y值),因此您可以轻松地找出两行中(x,y)
相同的值。如果不能,请继续maths stackexchange site,然后在此处张贴那个问题。
function Point(x,y) {
this.x = x;
this.y = y;
}
Point.prototype.draw = function(color="blue") {
var diff = 0.0125 ;
(new Line(this.x-diff, this.y-diff, this.x-diff, this.y+diff)).draw("normal", color);
(new Line(this.x-diff, this.y+diff, this.x+diff, this.y+diff)).draw("normal", color);
(new Line(this.x+diff, this.y+diff, this.x+diff, this.y-diff)).draw("normal", color);
(new Line(this.x+diff, this.y-diff, this.x-diff, this.y-diff)).draw("normal", color);
}
function Line(x1, y1, x2, y2) {
this.point1 = new Point(x1, y1);
this.point2 = new Point(x2, y2);
}
Line.prototype.draw = function(style="normal", color="black") {
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.save();
if (style == "dashed-back") {
ctx.setLineDash([5,3]); }
ctx.strokeStyle = color ;
ctx.beginPath();
ctx.moveTo(xp(this.point1.x), yp(this.point1.y));
ctx.lineTo(xp(this.point2.x), yp(this.point2.y));
ctx.stroke();
ctx.restore();
return this;
}
Line.prototype.intersect = function(otherLine) {
var grad1 = (this.point2.y - this.point1.y)/(this.point2.x - this.point1.x);
var grad2 = (otherLine.point2.y - otherLine.point1.y)/(otherLine.point2.x - otherLine.point1.x);
var remainder1 = this.point1.y - this.point1.x * grad1;
var remainder2 = otherLine.point1.y - otherLine.point1.x * grad2;
var x = (remainder2 - remainder1)/(grad1 - grad2);
var y = grad1 * x + remainder1;
return new Point(x, y);
}
Line.prototype.opposite = function(style = "normal", color = "Black") {
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.save();
var midway = new Point((this.point1.x + this.point2.x)/2, (this.point1.y + this.point2.y)/2);
var invgrad = -1 * 1/(this.point2.y - this.point1.y)/(this.point2.x - this.point1.x);
return new Line(midway.x - 100, midway.y - 100*invgrad, midway.x+100, midway.y + 100 * invgrad);
}
// Normalize points for normal plot
function xp (x) { return x*300+50 ; }
function yp (y) { return 450-(y*300) ; }
// Write a text
function text (str,x,y,size=12,color="black") {
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.save();
ctx.font = size+"px Arial" ;
ctx.fillStyle = color;
ctx.fillText(str,xp(x),yp(y));
ctx.restore();
}
// Init guides
function init () {
new Line(0, 0, 0, 1).draw("dashed-back", "#888");
new Line(0, 1, 3, 1).draw("dashed-back", "#888");
new Line(3, 1, 3, 0).draw("dashed-back", "#888");
new Line(1, 0, 1, 1).draw("dashed-back", "#888");
new Line(2, 0, 2, 1).draw("dashed-back", "#888");
text("1",-0.05,0.95)
text("0",-0.05,-0.05)
text("1",1,-0.05)
text("2",2,-0.05)
text("3",3,-0.05)
}
init();
var ax=0.00, ay=0.50 ;
var bx=1.00, by=1.00 ;
var cx=2.00, cy=0.25 ;
var dx=3.00, dy=0.75 ;
new Point(ax,ay).draw("red");
new Point(bx,by).draw("red");
new Point(cx,cy).draw("red");
new Point(dx,dy).draw("red");
var line1 = new Line(ax, ay, bx, by).draw("normal", "blue");
var line2 = new Line(bx, by, cx, cy).draw("normal", "blue");
var line3 = new Line(cx, cy, dx, dy).draw("normal", "blue");
line2.opposite().draw("normal", "red");
line1.opposite().draw("normal", "orange");
line1.opposite().intersect(line2.opposite()).draw("normal", "purple");
<canvas id="myCanvas" width="1000" height="600">
注意事项:我的代码有一个很大的错误-相对线的渐变被错误地计算为-1 * grad
而不是-1 / grad
。