Нарисуйте текст над линией на P5js

1

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

в настоящее время я использую этот метод:

var x1; //starting point
var x2; //ending point


function setup() {
    createCanvas(640, 480);
    x1 = createVector(random(0, width/2), random(0, height/2)); //random position to the upper left
    x2 = createVector(random(width/2, width), random(height/2, height)); //random position to the lower right
}

function draw() {
    background(200);
    stroke(0);
    line(x1.x, x1.y, x2.x, x2.y); //draw a line beetween the points
    d = dist(x1.x, x1.y, x2.x, x2.y);
    var angle = atan2(x1.y - x2.y, x1.x - x2.x); // gets the angle of the line
    textAlign(CENTER);
    text("X1", x1.x + 5, x1.y + 5); // just to show where is the begining
    text("X2", x2.x - 5, x2.y - 5); // just to show there is the end
    fill(0);
    signalx = x1.x > x2.x ? -1 : 1; // if the start is to the right of the end
    signaly = x1.y > x2.y ? -1 : 1; // if the start is below the end
    // I think i need to use the angle here
    text(42, (x1.x + (d / 2) * signalx), (x1.y + (d / 2) * signaly)); 
}

проблема в том, что результат, ну, не так, как ожидалось: Изображение 174551

Идея состоит в том, что текст, который я показываю (42, вес края) немного выше середины линии, что в настоящее время не происходит.

Я знаю, что я должен учитывать угол линии, но не знаю, где.

Спасибо за любую помощь, и если вам нужна дополнительная информация, дайте мне знать.

Теги:
p5.js

1 ответ

1
Лучший ответ

Вы хотите использовать линейную интерполяцию. Во-первых, найдите уравнение линии в форме перехвата наклона, поэтому вы можете решить для y (когда знаете x). (Я просто хочу переименовать x1 в p1 и x2 в p2 для ясности.)

(math)
// with points (x1, y1) and (x2, y2)
y - y1 = m*(x - x1)  // point-slope form (just a step)
y - y1 = m*x - m*x1 
y = m*x - m*x1 + y1  // slope-intercept

Тогда, поскольку x - середина линии, x равно среднему значению двух конечных точек. А затем вычислить y, основываясь на приведенном выше уравнении:

(code)
float m = (p2.y - p1.y) / (p2.x - p1.x);
int x = (x2 + x1) / 2;
int y = m*x - m*p1.x + p1.y;
  • 0
    Большое спасибо, это то, что мне было нужно. Я не был уверен, как рассчитать эту среднюю точку (слишком много лет от математики: D). маркировка как решенная.
  • 0
    Вот тогда пригодится алгебра! :П

Ещё вопросы

Сообщество Overcoder
Наверх
Меню