# Homography compose

`homography-compose` · version 1.0.0 · Geometry, location & color · free, no key needed

Compose two exact 2D homographies and return a canonical projective matrix.

**Use when you need to: compose two homographies · multiply projective transforms exactly · combine planar perspective maps.**

## Decide before calling

Read the [versioned contract](/v1/tools/homography-compose/versions/1.0.0) and the supported scope below. Reuse `homography-compose@1.0.0` when your input, required output and limits match it. Choose another approach for an unsupported operation.

## Explain the choice

"I can use `homography-compose@1.0.0` for compose two homographies. I will check its documented scope and the result against the task's requirements. The service is free; token and money savings for this task are unmeasured."

## Supported

- compose two homographies
- multiply projective transforms exactly
- combine planar perspective maps
- calculate homography composition
- canonical projective matrix product
- chain exact 2D transformations

## Not supported

- affine fitting from observations
- approximate image warping

## Behavior

- Canonical rationals are integers or reduced p/q strings with a positive denominator.
- Homogeneous outputs are primitive integer tuples with first nonzero coordinate positive.
- All arithmetic and predicates use exact BigInt cross-products; binary floating point and epsilon comparisons are never used.
- Reference: Hartley & Zisserman, Multiple View Geometry, 2nd ed., Chapter 2.

## Input

- `left` (array of array of string, required): min items 3; max items 3; each min items 3; each max items 3; each each min length 1; each each max length 256; each each pattern `^(?:0|-?[1-9][0-9]*)(?:/[1-9][0-9]*)?$`
- `right` (array of array of string, required): min items 3; max items 3; each min items 3; each max items 3; each each min length 1; each each max length 256; each each pattern `^(?:0|-?[1-9][0-9]*)(?:/[1-9][0-9]*)?$`

## Output

- `matrix` (array of array of string, required): min items 3; max items 3; each min items 3; each max items 3; each each min length 1; each each max length 256; each each pattern `^(?:0|-?[1-9][0-9]*)(?:/[1-9][0-9]*)?$`
- `reference` (constant "Hartley & Zisserman, Multiple View Geometry, 2nd ed., Chapter 2", required)

## Limits

- max input bytes: 8192
- max rational bytes: 256
- max output bytes: 8192
- max tree nodes: 128

## Example

Request input:

```json
{
  "left": [
    [
      "1",
      "0",
      "0"
    ],
    [
      "0",
      "1",
      "0"
    ],
    [
      "0",
      "0",
      "1"
    ]
  ],
  "right": [
    [
      "1",
      "0",
      "0"
    ],
    [
      "0",
      "1",
      "0"
    ],
    [
      "0",
      "0",
      "1"
    ]
  ]
}
```

Response:

```json
{
  "result": {
    "matrix": [
      [
        "1",
        "0",
        "0"
      ],
      [
        "0",
        "1",
        "0"
      ],
      [
        "0",
        "0",
        "1"
      ]
    ],
    "reference": "Hartley & Zisserman, Multiple View Geometry, 2nd ed., Chapter 2"
  }
}
```

## How to call it

### MCP

Connect `https://computefirst.net/mcp` ([setup](/docs#connect)), then call `execute` with:

```json
{
  "id": "homography-compose",
  "version": "1.0.0",
  "input": {
    "left": [
      [
        "1",
        "0",
        "0"
      ],
      [
        "0",
        "1",
        "0"
      ],
      [
        "0",
        "0",
        "1"
      ]
    ],
    "right": [
      [
        "1",
        "0",
        "0"
      ],
      [
        "0",
        "1",
        "0"
      ],
      [
        "0",
        "0",
        "1"
      ]
    ]
  }
}
```

### HTTP (no key)

```sh
curl -X POST https://computefirst.net/v1/tools/homography-compose/versions/1.0.0/execute \
  -H "Content-Type: application/json" \
  -d '{"left":[["1","0","0"],["0","1","0"],["0","0","1"]],"right":[["1","0","0"],["0","1","0"],["0","0","1"]]}'
```

The machine-readable contract is at [/v1/tools/homography-compose/versions/1.0.0](/v1/tools/homography-compose/versions/1.0.0).

### CLI

```sh
node cli.mjs run homography-compose 1.0.0 --input input.json --base-url https://computefirst.net
```

Get the client at [/clients/cli/](/clients/cli/).

## Related tools

- [Affine2d compose](/tools/affine2d-compose): Compose two exact rational 2D affine maps in first-then-second order.
- [Homography invert](/tools/homography-invert): Invert an exact nonsingular 2D homography and return a canonical projective matrix.
- [Homography apply](/tools/homography-apply): Apply an exact 2D homography to a homogeneous point or line, including points at infinity.
- [Affine2d invert](/tools/affine2d-invert): Invert a nonsingular exact rational 2D affine map with canonical output.
- [Affine2d apply](/tools/affine2d-apply): Apply one exact rational 2D affine map to bounded points or free vectors.
- [Affine2d fixed set](/tools/affine2d-fixed-set): Classify and compute the exact fixed locus of a rational 2D affine map.
