or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

booleans.mdcolors.mdcurves.mdexpansions-modifiers.mdextrusions.mdgeometries.mdhulls.mdindex.mdmaths.mdmeasurements.mdprimitives.mdtext-utils.mdtransforms.md
tile.json

geometries.mddocs/

0

# Geometry Types

1

2

Geometries are objects that represent the contents of primitives or the results of operations. Note: Geometries are considered immutable, so never change the contents directly. The library provides five main geometry types for different geometric representations.

3

4

## Capabilities

5

6

### 2D Geometry (geom2)

7

8

2D geometry consisting of sides (line segments) that form closed shapes.

9

10

```javascript { .api }

11

const geom2: {

12

/**

13

* Create a new 2D geometry from sides

14

* @param {Array} [sides] - Array of sides, each side is array of two points

15

* @returns {geom2} New 2D geometry

16

*/

17

create(sides?: Array<[[number, number], [number, number]]>): geom2;

18

19

/**

20

* Create deep copy of 2D geometry

21

* @param {geom2} geometry - Geometry to clone

22

* @returns {geom2} Cloned geometry

23

*/

24

clone(geometry: geom2): geom2;

25

26

/**

27

* Check if object is a geom2

28

* @param {Object} object - Object to test

29

* @returns {Boolean} True if object is geom2

30

*/

31

isA(object: any): boolean;

32

33

/**

34

* Get the sides of a 2D geometry

35

* @param {geom2} geometry - Input geometry

36

* @returns {Array} Array of sides

37

*/

38

toSides(geometry: geom2): Array<[[number, number], [number, number]]>;

39

40

/**

41

* Get outline points of 2D geometry

42

* @param {geom2} geometry - Input geometry

43

* @returns {Array} Array of [x,y] points

44

*/

45

toPoints(geometry: geom2): Array<[number, number]>;

46

47

/**

48

* Reverse the orientation of 2D geometry

49

* @param {geom2} geometry - Input geometry

50

* @returns {geom2} Reversed geometry

51

*/

52

reverse(geometry: geom2): geom2;

53

54

/**

55

* Transform 2D geometry using matrix

56

* @param {mat4} matrix - Transformation matrix

57

* @param {geom2} geometry - Input geometry

58

* @returns {geom2} Transformed geometry

59

*/

60

transform(matrix: mat4, geometry: geom2): geom2;

61

62

/**

63

* Validate 2D geometry for errors

64

* @param {geom2} geometry - Geometry to validate

65

* @returns {Boolean} True if valid

66

*/

67

validate(geometry: geom2): boolean;

68

};

69

```

70

71

**Usage Examples:**

72

73

```javascript

74

const { geom2 } = require('@jscad/modeling').geometries;

75

76

// Create geometry from sides

77

const sides = [

78

[[0, 0], [5, 0]],

79

[[5, 0], [5, 3]],

80

[[5, 3], [0, 3]],

81

[[0, 3], [0, 0]]

82

];

83

const rect = geom2.create(sides);

84

85

// Clone geometry

86

const rectCopy = geom2.clone(rect);

87

88

// Get outline points

89

const points = geom2.toPoints(rect);

90

// [[0, 0], [5, 0], [5, 3], [0, 3]]

91

92

// Check if valid geometry

93

const isValid = geom2.validate(rect);

94

```

95

96

### 3D Geometry (geom3)

97

98

3D geometry consisting of polygons that form solid shapes.

99

100

```javascript { .api }

101

const geom3: {

102

/**

103

* Create a new 3D geometry from polygons

104

* @param {Array} [polygons] - Array of poly3 objects

105

* @returns {geom3} New 3D geometry

106

*/

107

create(polygons?: poly3[]): geom3;

108

109

/**

110

* Create deep copy of 3D geometry

111

* @param {geom3} geometry - Geometry to clone

112

* @returns {geom3} Cloned geometry

113

*/

114

clone(geometry: geom3): geom3;

115

116

/**

117

* Check if object is a geom3

118

* @param {Object} object - Object to test

119

* @returns {Boolean} True if object is geom3

120

*/

121

isA(object: any): boolean;

122

123

/**

124

* Get the polygons of a 3D geometry

125

* @param {geom3} geometry - Input geometry

126

* @returns {Array} Array of poly3 objects

127

*/

128

toPolygons(geometry: geom3): poly3[];

129

130

/**

131

* Get all vertices of 3D geometry

132

* @param {geom3} geometry - Input geometry

133

* @returns {Array} Array of [x,y,z] vertices

134

*/

135

toVertices(geometry: geom3): Array<[number, number, number]>;

136

137

/**

138

* Reverse the orientation of 3D geometry

139

* @param {geom3} geometry - Input geometry

140

* @returns {geom3} Reversed geometry

141

*/

142

reverse(geometry: geom3): geom3;

143

144

/**

145

* Transform 3D geometry using matrix

146

* @param {mat4} matrix - Transformation matrix

147

* @param {geom3} geometry - Input geometry

148

* @returns {geom3} Transformed geometry

149

*/

150

transform(matrix: mat4, geometry: geom3): geom3;

151

152

/**

153

* Validate 3D geometry for errors

154

* @param {geom3} geometry - Geometry to validate

155

* @returns {Boolean} True if valid

156

*/

157

validate(geometry: geom3): boolean;

158

};

159

```

160

161

**Usage Examples:**

162

163

```javascript

164

const { geom3, poly3 } = require('@jscad/modeling').geometries;

165

166

// Create simple tetrahedron

167

const vertices1 = [[0, 0, 0], [1, 0, 0], [0.5, 1, 0]];

168

const vertices2 = [[0, 0, 0], [0.5, 1, 0], [0.5, 0.5, 1]];

169

const vertices3 = [[1, 0, 0], [0.5, 1, 0], [0.5, 0.5, 1]];

170

const vertices4 = [[0, 0, 0], [1, 0, 0], [0.5, 0.5, 1]];

171

172

const polygons = [

173

poly3.create(vertices1),

174

poly3.create(vertices2),

175

poly3.create(vertices3),

176

poly3.create(vertices4)

177

];

178

const tetrahedron = geom3.create(polygons);

179

180

// Get all vertices

181

const allVertices = geom3.toVertices(tetrahedron);

182

183

// Validate geometry

184

const isValid = geom3.validate(tetrahedron);

185

```

186

187

### 2D Path (path2)

188

189

2D geometry consisting of ordered points that form an open or closed path.

190

191

```javascript { .api }

192

const path2: {

193

/**

194

* Create a new 2D path from points

195

* @param {Array} [points] - Array of [x,y] points

196

* @param {Boolean} [isClosed=false] - Whether path is closed

197

* @returns {path2} New 2D path

198

*/

199

create(points?: Array<[number, number]>, isClosed?: boolean): path2;

200

201

/**

202

* Create 2D path from points array

203

* @param {Array} points - Array of [x,y] points

204

* @returns {path2} New path

205

*/

206

fromPoints(points: Array<[number, number]>): path2;

207

208

/**

209

* Create deep copy of 2D path

210

* @param {path2} geometry - Path to clone

211

* @returns {path2} Cloned path

212

*/

213

clone(geometry: path2): path2;

214

215

/**

216

* Check if object is a path2

217

* @param {Object} object - Object to test

218

* @returns {Boolean} True if object is path2

219

*/

220

isA(object: any): boolean;

221

222

/**

223

* Get points of 2D path

224

* @param {path2} geometry - Input path

225

* @returns {Array} Array of [x,y] points

226

*/

227

toPoints(geometry: path2): Array<[number, number]>;

228

229

/**

230

* Close the 2D path by connecting last point to first

231

* @param {path2} geometry - Input path

232

* @returns {path2} Closed path

233

*/

234

close(geometry: path2): path2;

235

236

/**

237

* Reverse the direction of 2D path

238

* @param {path2} geometry - Input path

239

* @returns {path2} Reversed path

240

*/

241

reverse(geometry: path2): path2;

242

243

/**

244

* Transform 2D path using matrix

245

* @param {mat4} matrix - Transformation matrix

246

* @param {path2} geometry - Input path

247

* @returns {path2} Transformed path

248

*/

249

transform(matrix: mat4, geometry: path2): path2;

250

251

/**

252

* Append points to existing path

253

* @param {path2} geometry - Input path

254

* @param {...Array} points - Points to append

255

* @returns {path2} Extended path

256

*/

257

appendPoints(geometry: path2, ...points: Array<[number, number]>): path2;

258

};

259

```

260

261

**Usage Examples:**

262

263

```javascript

264

const { path2 } = require('@jscad/modeling').geometries;

265

266

// Create open path

267

const points = [[0, 0], [5, 0], [5, 5], [2, 8], [0, 5]];

268

const openPath = path2.fromPoints(points);

269

270

// Create closed path

271

const closedPath = path2.close(openPath);

272

273

// Append more points

274

const extended = path2.appendPoints(openPath, [10, 10], [15, 5]);

275

276

// Get path points

277

const pathPoints = path2.toPoints(extended);

278

```

279

280

### 2D Polygon (poly2)

281

282

2D polygon consisting of ordered vertices that form a closed shape.

283

284

```javascript { .api }

285

const poly2: {

286

/**

287

* Create a new 2D polygon from vertices

288

* @param {Array} [vertices] - Array of [x,y] vertices

289

* @returns {poly2} New 2D polygon

290

*/

291

create(vertices?: Array<[number, number]>): poly2;

292

293

/**

294

* Create deep copy of 2D polygon

295

* @param {poly2} geometry - Polygon to clone

296

* @returns {poly2} Cloned polygon

297

*/

298

clone(geometry: poly2): poly2;

299

300

/**

301

* Check if object is a poly2

302

* @param {Object} object - Object to test

303

* @returns {Boolean} True if object is poly2

304

*/

305

isA(object: any): boolean;

306

307

/**

308

* Get vertices of 2D polygon

309

* @param {poly2} geometry - Input polygon

310

* @returns {Array} Array of [x,y] vertices

311

*/

312

toVertices(geometry: poly2): Array<[number, number]>;

313

314

/**

315

* Reverse the orientation of 2D polygon

316

* @param {poly2} geometry - Input polygon

317

* @returns {poly2} Reversed polygon

318

*/

319

reverse(geometry: poly2): poly2;

320

321

/**

322

* Transform 2D polygon using matrix

323

* @param {mat4} matrix - Transformation matrix

324

* @param {poly2} geometry - Input polygon

325

* @returns {poly2} Transformed polygon

326

*/

327

transform(matrix: mat4, geometry: poly2): poly2;

328

};

329

```

330

331

**Usage Examples:**

332

333

```javascript

334

const { poly2 } = require('@jscad/modeling').geometries;

335

336

// Create triangle

337

const vertices = [[0, 0], [5, 0], [2.5, 4]];

338

const triangle = poly2.create(vertices);

339

340

// Get vertices

341

const triangleVertices = poly2.toVertices(triangle);

342

343

// Reverse orientation (clockwise to counter-clockwise)

344

const reversed = poly2.reverse(triangle);

345

```

346

347

### 3D Polygon (poly3)

348

349

3D polygon consisting of ordered vertices that form a planar face in 3D space.

350

351

```javascript { .api }

352

const poly3: {

353

/**

354

* Create a new 3D polygon from vertices

355

* @param {Array} [vertices] - Array of [x,y,z] vertices

356

* @returns {poly3} New 3D polygon

357

*/

358

create(vertices?: Array<[number, number, number]>): poly3;

359

360

/**

361

* Create deep copy of 3D polygon

362

* @param {poly3} geometry - Polygon to clone

363

* @returns {poly3} Cloned polygon

364

*/

365

clone(geometry: poly3): poly3;

366

367

/**

368

* Check if object is a poly3

369

* @param {Object} object - Object to test

370

* @returns {Boolean} True if object is poly3

371

*/

372

isA(object: any): boolean;

373

374

/**

375

* Get vertices of 3D polygon

376

* @param {poly3} geometry - Input polygon

377

* @returns {Array} Array of [x,y,z] vertices

378

*/

379

toVertices(geometry: poly3): Array<[number, number, number]>;

380

381

/**

382

* Get plane equation of 3D polygon

383

* @param {poly3} geometry - Input polygon

384

* @returns {Array} Plane as [a,b,c,d]

385

*/

386

plane(geometry: poly3): [number, number, number, number];

387

388

/**

389

* Reverse the orientation of 3D polygon

390

* @param {poly3} geometry - Input polygon

391

* @returns {poly3} Reversed polygon

392

*/

393

reverse(geometry: poly3): poly3;

394

395

/**

396

* Transform 3D polygon using matrix

397

* @param {mat4} matrix - Transformation matrix

398

* @param {poly3} geometry - Input polygon

399

* @returns {poly3} Transformed polygon

400

*/

401

transform(matrix: mat4, geometry: poly3): poly3;

402

};

403

```

404

405

**Usage Examples:**

406

407

```javascript

408

const { poly3 } = require('@jscad/modeling').geometries;

409

410

// Create 3D triangle

411

const vertices = [[0, 0, 0], [5, 0, 0], [2.5, 4, 2]];

412

const triangle3D = poly3.create(vertices);

413

414

// Get plane equation

415

const trianglePlane = poly3.plane(triangle3D);

416

417

// Get vertices

418

const vertices3D = poly3.toVertices(triangle3D);

419

```

420

421

## Advanced Geometry Operations

422

423

### Geometry Conversion

424

425

Convert between different geometry types:

426

427

```javascript

428

const { geom2, path2, poly2 } = require('@jscad/modeling').geometries;

429

430

// Convert path to geom2 (if closed)

431

const points = [[0, 0], [5, 0], [5, 5], [0, 5], [0, 0]];

432

const closedPath = path2.fromPoints(points);

433

const convertedGeom = geom2.create(path2.toSides(closedPath));

434

435

// Extract polygon from geom2

436

const sides = geom2.toSides(convertedGeom);

437

const outline = sides.map(side => side[0]); // First point of each side

438

const polygon = poly2.create(outline);

439

```

440

441

### Geometry Validation and Repair

442

443

Validate and repair geometry issues:

444

445

```javascript

446

const { geom2, geom3 } = require('@jscad/modeling').geometries;

447

448

const validateAndRepair = (geometry) => {

449

if (geom2.isA(geometry)) {

450

const isValid = geom2.validate(geometry);

451

if (!isValid) {

452

console.warn('Invalid 2D geometry detected');

453

// Attempt repair by removing duplicate points

454

const points = geom2.toPoints(geometry);

455

const uniquePoints = points.filter((point, index) => {

456

return index === 0 ||

457

point[0] !== points[index-1][0] ||

458

point[1] !== points[index-1][1];

459

});

460

return geom2.fromPoints(uniquePoints);

461

}

462

}

463

return geometry;

464

};

465

```

466

467

### Custom Geometry Creation

468

469

Create complex geometries programmatically:

470

471

```javascript

472

const { geom2, poly2 } = require('@jscad/modeling').geometries;

473

474

// Create star shape using polygon

475

const createStar = (points, outerRadius, innerRadius) => {

476

const vertices = [];

477

const angleStep = (Math.PI * 2) / points;

478

479

for (let i = 0; i < points; i++) {

480

// Outer point

481

const outerAngle = i * angleStep;

482

vertices.push([

483

Math.cos(outerAngle) * outerRadius,

484

Math.sin(outerAngle) * outerRadius

485

]);

486

487

// Inner point

488

const innerAngle = (i + 0.5) * angleStep;

489

vertices.push([

490

Math.cos(innerAngle) * innerRadius,

491

Math.sin(innerAngle) * innerRadius

492

]);

493

}

494

495

return poly2.create(vertices);

496

};

497

498

const star = createStar(5, 10, 5);

499

```

500

501

### Geometry Analysis

502

503

Analyze geometry properties:

504

505

```javascript

506

const { geom2, geom3, measureArea, measureVolume } = require('@jscad/modeling');

507

508

const analyzeGeometry = (geometry) => {

509

const analysis = {};

510

511

if (geom2.isA(geometry)) {

512

analysis.type = '2D';

513

analysis.points = geom2.toPoints(geometry);

514

analysis.sides = geom2.toSides(geometry).length;

515

analysis.area = measureArea(geometry);

516

} else if (geom3.isA(geometry)) {

517

analysis.type = '3D';

518

analysis.polygons = geom3.toPolygons(geometry).length;

519

analysis.vertices = geom3.toVertices(geometry).length;

520

analysis.volume = measureVolume(geometry);

521

analysis.surfaceArea = measureArea(geometry);

522

}

523

524

return analysis;

525

};

526

```

527

528

### Performance Considerations

529

530

- Geometry objects are immutable - operations create new instances

531

- Use clone() for deep copies when modifying geometries

532

- Validate geometries after complex operations

533

- Consider using appropriate geometry type for your use case:

534

- path2 for open curves and drawing operations

535

- geom2 for solid 2D shapes and boolean operations

536

- poly2/poly3 for direct polygon manipulation

537

- geom3 for solid 3D shapes and volumes