# Homography apply

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

Apply an exact 2D homography to a homogeneous point or line, including points at infinity.

**Use when you need to: apply homography to point · transform homogeneous line · map point at infinity.**

## Decide before calling

Read the [versioned contract](/v1/tools/homography-apply/versions/1.0.0) and the supported scope below. Reuse `homography-apply@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-apply@1.0.0` for apply homography to point. 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

- apply homography to point
- transform homogeneous line
- map point at infinity
- exact projective coordinate transform
- apply planar perspective map
- transform 2D projective entity

## Not supported

- raster image resampling
- geographic coordinate conversion

## 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

- `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]*)?$`
- `kind` (one of "point", "line", required)
- `coordinates` (array of string, required): min items 3; max items 3; each min length 1; each max length 256; each pattern `^(?:0|-?[1-9][0-9]*)(?:/[1-9][0-9]*)?$`

## Output

- `kind` (one of "point", "line", required)
- `coordinates` (array of string, required): min items 3; max items 3; each min length 1; each max length 256; each pattern `^(?:0|-?[1-9][0-9]*)(?:/[1-9][0-9]*)?$`
- `classification` (one of "finite", "infinity", "line", required)
- `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
{
  "matrix": [
    [
      "1",
      "0",
      "0"
    ],
    [
      "0",
      "1",
      "0"
    ],
    [
      "0",
      "0",
      "1"
    ]
  ],
  "kind": "point",
  "coordinates": [
    "2",
    "3",
    "1"
  ]
}
```

Response:

```json
{
  "result": {
    "kind": "point",
    "coordinates": [
      "2",
      "3",
      "1"
    ],
    "classification": "finite",
    "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-apply",
  "version": "1.0.0",
  "input": {
    "matrix": [
      [
        "1",
        "0",
        "0"
      ],
      [
        "0",
        "1",
        "0"
      ],
      [
        "0",
        "0",
        "1"
      ]
    ],
    "kind": "point",
    "coordinates": [
      "2",
      "3",
      "1"
    ]
  }
}
```

### HTTP (no key)

```sh
curl -X POST https://computefirst.net/v1/tools/homography-apply/versions/1.0.0/execute \
  -H "Content-Type: application/json" \
  -d '{"matrix":[["1","0","0"],["0","1","0"],["0","0","1"]],"kind":"point","coordinates":["2","3","1"]}'
```

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

### CLI

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

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

## Related tools

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