Leo Mada
2025-Sep-01 18:32 UTC
[R] Connecting a midpoint of a segment at a 90 degree angle to the next nearest point of a neighboring segment
Dear David, I am replying to your question with a little delay. I hope though that you can find the following hints useful. If I understand the task correctly: You want to draw an orthogonal line to another line and find out where this line intersects a 3rd line. You can decompose your problem into 2 separate tasks: 1. "Draw" a line orthogonal to the first line; (a physical drawing is not needed) 2. Compute the intersection of this new line with the desired line; Task 1 is equivalent to translating a point orthogonally to a given line. I think you want to do it with the midpoint. Have a look at the functions shiftLine and shift.ortho on GitHub: https://github.com/discoleo/BioShapes/blob/main/R/Graphic.Helper.R You can shift the point for a given distance, e.g. 1 unit - and thus have a new line segment. ### Shift Point or Line # Shifts a point orthogonal to a given line; # d = distance to shift (translate); # simplify = TRUE: if(length(d) == 1) return a simple list(x, y); # otherwise return a data.frame; # Note: direction of shift is not normalized with respect to quadrant; [...] Note: - the "scale" argument can be used to plot on a non-square coordinate system and let the 2 lines *look*"prthogonal" on this non-square grid; - if you do not need such functionality, you can set scale = 1 and simplify the formulas; 2. Intersection of segments See function intersect.lines in the same file on GitHub. The function returns the relative positions relative to the 2 line segments where they intersect, i.e.: - Parameter t1 = Fraction of 1st line segment; - Parameter t2 = Fraction of 2nd line segment; Real intersection: 0 <= t <= 1; You may also need the function slope() (in the same file). The functions in this file reference only other functions in this file (although I do not think there are any other calls). Hope you can work it out. Sincerely, Leonard [[alternative HTML version deleted]]