10
votes

Faites pivoter le texte autour de son centre à Pycairo

communauté.

Je sais qu'il existe de nombreuses réponses ici, des manuels, des tutoriels et des références sur les internets et Amny plus sur cette question. De plus, je sais que la connaissance de l'algèbre linéaire est requise. Mais quand je pense au temps de déterminer toute la théorie et de résoudre des exercices en pratique - ma tête souffle et je ne peux pas faire les choses les plus simples: (

s'il vous plaît, si vous connaissez une petite solution rapide Comment faire la rotation du texte sur son centre avant de le rendre - dites-moi, plezease.

pour l'instant, j'ai: xxx

mais ma lettre isn ' t rotatif autour de lui-même. C'est comme tomber sur le côté droit :( Je sais que mon code n'est pas correct. Peut-être que je manque de transformation, mais je ne sais pas comment faire correctement.

Mise à jour: Malheureusement, le texte n'est pas affecté par les traductions, donc xxx

sera exactement identique à xxx

et je ne sais pas comment faire une rotation du texte sur son centre sans faire de nouvelle surface ou quelque chose (comme Nouvelle couche en processeur graphique): (


0 commentaires

4 Réponses :


1
votes

devrait xxx

être xxx

?

qui pourrait expliquer pourquoi il est tomber à le côté droit .


2 commentaires

Oh, s'il vous plaît, c'est de ma faute. J'ai écrit ce code de ma tête sur mon téléphone. Sur le vrai code, c'est calme comme dans votre exemple. Mais quand je rentre à la maison, je vérifierai. Vous pensez que la traduction - est la seule transformation dont j'ai besoin?


Ce n'est pas une erreur. le résultat est le même. Peut-être que quelque chose de complexe résoudra cette situation? Peut-être une nouvelle matrice de transformation ou une commande de code différente?



6
votes

OK, le Caire permet de transférer le texte mobile_to et tournez. Cela signifie que ce que vous voulez, c'est de comprendre (x, y) pour mobile_to (t), de sorte que lorsque vous faites pivoter (r), le point central de votre texte est à l'emplacement souhaité, c = (CX, CY):

Entrez la description de l'image ici

Vous devez donc résoudre l'équation MV = C , où v est le centre de texte par rapport à l'origine du texte: xxx

vérifications de santé mentale:

  • quand r est 0 (pas de rotation), vous obtenez x = cx-w / 2, y = cy-h ', que vous connaissez. est la bonne réponse
  • quand r = -90 (texte sur le côté, avec "up" vers la droite), vous obtenez ce que vous attendez, IE X = CX - H 'et Y = CY + W / 2

    pour le code Python, vous devrez réécrire l'équation ci-dessus afin de vous retrouver avec un * t = B, où T = (x, y), et vous allez calculer t = inv (a) * b. Ensuite, vous allez simplement faire xxx

    Notez que le système de coordonnées au Caire a + y en descente, il y aura quelques signes de couple à réparer, et peut-être que Y_Bearing n'est pas correct, Mais vous avez l'idée.


6 commentaires

"Placez le texte à text_center" - comment puis-je faire cela? Je n'ai que la fonction séparée Cr.Move_To (x, y) et séparé cr.show_text (texte). Quand dois-je faire bouger_to () - avant la translation et la rotation ou après et avant de placer du texte?


Mon text_center signifie coordonnées des X de l'origine X, Y pour placer du texte exactement pour superposer le point préféré par son centre (texte) (W / 2, H / 2).


Ces codes ne fonctionnent pas et ne fonctionneront pas car la rotation arrive toujours autour de Current_Point . Si j'écris: cr.move_to (a, b); cr.rotate (rad); cr.show_text (); - il sera tourné uniquement autour de (A, B) et la traduction n'affectera pas la rotation. Mais je sais qu'il y a des formules comme [ici] [1] pour calculer de nouvelles coordonnées où passer à. [1]: codeProject.com/kb/gdi/textrotation.aspx? Affichage = imprimante


Merci beaucoup pour votre réponse élargie. Je ne peux pas comprendre quelques choses dans cela, mais je vais essayer de comprendre parce qu'il est très important pour moi de comprendre tout cela dans ma propre tête =) merci beaucoup!


@ Крайст Ce serait bien si vous pouviez laisser tout le monde savoir s'il s'agit de la réponse (marque comme réponse), ou du moins utile (Votez-vous, avec des commentaires sur ce que vous trouvez).


S'il vous plaît, pouvez-vous expliquer votre réponse pour le débutant? Je ne peux que sentir que c'est la bonne réponse ou très utile, mais ma connaissance ne suffit pas pour le comprendre :(



13
votes

au moins sur la version du Caire disponible sur ma machine (1.8.8), l'approche suivante fonctionne pour moi: xxx

qui peut être utilisé de la manière suivante: xxx

text-demo.png


5 commentaires

Génie et parfait! Oh, puisque j'ai demandé cette question, j'ai gelé mon projet et ouvert des livres de mathématiques jusqu'à présent. Je sais que votre solution est ce que je voulais et je vais simplement le coller mon code si cela ne vous dérange pas et écrirez votre nom dans les commentaires. Mais les mathématiques sont grandes et intéressantes, alors je continuerai à apprendre quelque chose de nouveau. Pouvez-vous me dire où trouver votre solution dans des livres de mathématiques: comment ça veut dire et qu'est-ce que c'est? Merci de votre aide.


@Schollii était correct, mais il s'avère que certaines subordonnées de l'API du Caire qui le rendent un peu intéressant. Le point clé est que les rotations se produisent toujours de l'origine. Cela signifie que vous devez traduire l'origine à l'endroit où vous souhaitez dessiner le texte. Ensuite, vous pouvez faire votre rotation. Enfin, assurez-vous que le texte rendu passe à travers votre point, vous devez faire une traduction finale (dans la trame de coordonnée en rotation). La commande mobile_to garantit que le texte sera ensuite rendu de l'origine.


Ce type de mathématiques peut probablement être décrit mieux à l'aide du terme Matrices de transformation , qui sont vraiment un façon d'exprimer des transformations coordonnées. Dans un sens très large, il s'agit d'un problème d'algèbre linéaire. Cette tâche est particulièrement importante dans la mécanique (qui est à son tour importante pour les développeurs de logiciels impliqués dans la physique, la robotique et le développement de jeux).


Bien sûr, Schollii avait raison mais la trigonométrie fonctionne à Python abaisse beaucoup la précision. Sur la première vue, votre méthode très précise et peut-être plus rapide. J'utiliserai ce code dans l'application Web et il est important pour le rendu d'image dynamique et les opérations de points flottants. Merci encore une fois. L'algèbre linéaire est sur mon chemin :)


Ne semble pas fonctionner pour moi. Mon cas spécial peut-être que j'utilise des personnages simples seulement. Des idées ?



1
votes

Fonction de classe basée sur l'entrée ci-dessus avec prise en charge de texte multiligne.

def text(self, text, x, y, rotation=0, fontName="Arial", fontSize=10, verticalPadding=0):

    rotation = rotation * math.pi / 180

    self.ctx.select_font_face(fontName, cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
    self.ctx.set_font_size(fontSize)

    fascent, fdescent, fheight, fxadvance, fyadvance = self.ctx.font_extents()

    self.ctx.save()
    self.ctx.translate(x, y)
    self.ctx.rotate(rotation)

    lines = text.split("\n")

    for i in xrange(len(lines)):
        line = lines[i]
        xoff, yoff, textWidth, textHeight = self.ctx.text_extents(line)[:4]

        offx = -textWidth / 2.0
        offy = (fheight / 2.0) + (fheight + verticalPadding) * i

        self.ctx.move_to(offx, offy)
        self.ctx.show_text(line)

    self.ctx.restore()


3 commentaires

Quelque chose a changé au cours des 5 dernières années? C'était mon projet d'animal de compagnie et j'ai abandonné cela il y a longtemps, commençant à étudier les mathématiques. Je n'ai pas été de retour à ce projet depuis. Cependant, je suis curieux d'essayer de tout essayer.


12 changé à 17.


Je voulais dire le Caire / Pycairo