Можно ли получить доступ к координатам контура глифа для построенной строки в R?

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

Мне интересно, можно ли получить доступ к фактическим координатам контура отдельных букв (глифов?), чтобы я мог упаковывать слова намного ближе друг к другу - и даже делать такие вещи, как нанесение слова внутри отверстия например, в середине символа «о».

Все мои поиски оказались безрезультатными. Эта ссылка кажется актуальной, но для TeX https://tex.stackexchange.com/questions/180510/how-to-get-intersection-points-of-two-glyphs


person Holmestorm    schedule 26.08.2019    source источник
comment
comment
Спасибо @Henrik за некоторую интересную информацию о интервалах между глифами, но я не думаю, что есть что-то, что помогло бы мне получить доступ к самим границам глифов. Я буду продолжать искать, и, надеюсь, кто-то здесь сможет пролить свет!   -  person Holmestorm    schedule 27.08.2019


Ответы (1)


Этот вопрос получил очень мало внимания, но после довольно долгих поисков мне удалось найти решение, которое работало для моих целей, и я делюсь им для справки.

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

Увидев этот ответ https://stackoverflow.com/a/7745776/5825522 на несвязанный вопрос, я начал путь с помощью пакета grImport для трассировки файла postscript. И я смог вместе взломать решение (пример ниже), которое в конечном итоге сработало, хотя я не могу признаться, что понимаю все тонкости кода postscript и синтаксического анализа XML (поскольку это было мое первое знакомство с обеими темами!)

Обратите внимание, что во время моего исследования я также нашел этот пакет https://github.com/yixuan/fontr, который может быть более полезен для извлечения реальных координат нанесенных символов, но я не мог понять и использовать его.

library(grImport)
library(magrittr)
library(xml2)

# Create postscript file for the letter 'S' in times new roman
cat("%!PS 
    /Times-Roman findfont
    10 scalefont 
    setfont 
    newpath 0 0 moveto (S) show",
    file="example.ps")

# Trace the postscript file to an XML file
grImport::PostScriptTrace("example.ps", "example.xml")

# Read the XML
xml <- xml2::read_xml("example.xml")

# Extract the XML node associated with the letter paths
letter_paths <- xml_find_all(xml, "text/path")

# Extract coordinates
x <- letter_paths %>% xml_find_all("move|line") %>% xml_attr("x") %>% as.numeric()
y <- letter_paths %>% xml_find_all("move|line") %>% xml_attr("y") %>% as.numeric()

# Remove last pair of coordinates as the post script tracing leaves undesired xy coordinates. 
# These corrections are tricky for glyphs that have 'holes' in them like 'O' and 'B'
x <- x[-length(x)]
y <- y[-length(y)]

# plot
plot(x,y, asp=1, type="l")
points(x,y)

Буква 'S'

И после некоторой возни я смог создать набор глифов, который работал на меня.

Набор глифов

person Holmestorm    schedule 21.09.2019