Vraag : Vertalende coördinaten van één gecoördineerd systeem aan een andere

Op een blad van document:
The X coördinaat van links naar rechts de coördinatenverhogingen van Y
The van boven tot onder
(0.0) bedraagt hoogste linkercorner.

I heeft twee punten op dit blad verhoogt: (x1, y1) en (x2, y1) (d.w.z., zijn zij allebei op de zelfde horizontale lijn)

I fotokopi�ërt nu dit blad. Tijdens het fotokopiëren, lichtjes verschoof het oorspronkelijke document, en roteert ook lichtjes. Dientengevolge, werden mijn twee originele punten nu (op dit nieuwe blad van document):
(x3, y3) en (x4, y4).

Now, gezien om het even welk punt (a1, b1) op het oorspronkelijke blad van document, zouden wat zijn coördinaten op het nieuwe blad van document zijn?

I dacht ik correcte formulat voor dit had afgeleid, maar ik schijn altijd een paar pixel off.

Thanks.
te zijn

Antwoord : Vertalende coördinaten van één gecoördineerd systeem aan een andere

U hebt waarschijnlijk reeds de correcte vergelijkingen afgeleid, maar door het hoe dan ook gegaan.

U wilt een stijve transformatie die (x1, y1) (x3, y3), en (x2, y1) vertaalt (x4, y4).

Wij kunnen aan de stijve die transformatie als vertaling denken, door een omwenteling wordt gevolgd.  Wij zullen met een vertaling beginnen die zich (x1, y1) beweegt (x3, y3).  Dit is gemakkelijk:

(a, B) ---> (a + x3 - x1, B + y3 - y1)

de truc zal doen.

Nu, willen wij een transformatie die rond het punt roteert (x3, y3) zodat het punt oorspronkelijk bij (x2, y1), dat over (x2 + x3 - x1, y3) in kaart is gebracht, roteert over (x4, y4).

Werk de hoek van deze omwenteling uit.  Herinner eraan dat de richting van een vector (x, y) door de (y, x) functie atan2 (de meeste math bibliotheken hebben een atan2 die het kwadrant van de vector evenals zijn arctan bepaalt - gebruik niet de eenvoudige atan (y/x) kan worden bepaald functie voor dit).

Zo is de totale omwenteling enkel het verschil tussen de twee hoekige richtingen, dat is

theta = atan2 (y4 - y3, x4 - x3) - atan2 (x2 - x1, 0)

(herinner dat wij vectoren nodig hebben die op het punt beginnen (x3, y3), zodat moet dit van allebei van de punten) worden afgetrokken.

O.k., nu, passen wij eenvoudig een omwentelingsverrichting toe.

(c, D) > (c * cos. (theta) - D * zonde (theta), c * zonde (theta) + D * cos. (theta))

waar (c, D) = (a + x3 - x1, B + y3 - y1), van voordien.


Als u vindt dat u weg door een paar pixel dichtbij de rand van uw beeld zou kunnen zijn, lijdt u aan een resolutieprobleem: de ware plaatsen van uw twee punten zijn niet werkelijk (x3, y3) en (x4, y4), maar die zijn enkel het dichtst coördineren.  Dit beïnvloedt niet de vertaling, aangezien de zelfde die (sub-pixel) fout enkel door het beeld wordt verspreid wordt.  Maar voor de omwenteling, kon zich een kleine fout in de omwenteling dichtbij (x4, y4) in een grotere fout verder afwenden.  Fundamenteel, zal de fout iets rond de resolutie van uw die beeld zijn door abs wordt verdeeld (x2 - x1).  Als x2 en x1 samen dicht zijn, kunt u zien waarom u weg door een paar pixel zou kunnen zijn.

Er is werkelijk geen goede manier om voor dit te verbeteren, buiten nauwkeuriger het worden coördineert voor (x3, y3) en (x4, y4), of krijgend afbeeldingen voor meer dan twee punten, en doend een beste geschikt op de vertaling en de omwenteling u wilt.

Hoop dit helpt!
Andere oplossingen  
 
programming4us programming4us