Skip to content
Snippets Groups Projects
Commit 260dfb41 authored by Alexander Rose's avatar Alexander Rose
Browse files

prism and pyramid cage

parent 625fdec8
No related branches found
No related tags found
No related merge requests found
......@@ -7,12 +7,13 @@
import { Vec3 } from 'mol-math/linear-algebra'
import { Primitive, PrimitiveBuilder } from './primitive';
import { polygon } from './polygon'
import { Cage } from './cage';
const on = Vec3.create(0, 0, -0.5), op = Vec3.create(0, 0, 0.5)
const a = Vec3.zero(), b = Vec3.zero(), c = Vec3.zero(), d = Vec3.zero()
/**
* Create a prism with a polygonal base of 4 or more points
* Create a prism with a base of 4 or more points
*/
export function Prism(points: ArrayLike<number>): Primitive {
const sideCount = points.length / 3
......@@ -62,4 +63,58 @@ let hexagonalPrism: Primitive
export function HexagonalPrism() {
if (!hexagonalPrism) hexagonalPrism = Prism(polygon(6, true))
return hexagonalPrism
}
//
/**
* Create a prism cage
*/
export function PrismCage(points: ArrayLike<number>): Cage {
const sideCount = points.length / 3
// const count = 4 * sideCount
const vertices: number[] = []
const edges: number[] = []
let offset = 0
// vertices and side edges
for (let i = 0; i < sideCount; ++i) {
vertices.push(
points[i * 3], points[i * 3 + 1], -0.5,
points[i * 3], points[i * 3 + 1], 0.5
)
edges.push(offset, offset + 1)
offset += 2
}
// bases edges
for (let i = 0; i < sideCount; ++i) {
const ni = (i + 1) % sideCount
edges.push(
i * 2, ni * 2,
i * 2 + 1, ni * 2 + 1
)
}
return { vertices, edges }
}
let diamondCage: Cage
export function DiamondPrismCage() {
if (!diamondCage) diamondCage = PrismCage(polygon(4, false))
return diamondCage
}
let pentagonalPrismCage: Cage
export function PentagonalPrismCage() {
if (!pentagonalPrismCage) pentagonalPrismCage = PrismCage(polygon(5, false))
return pentagonalPrismCage
}
let hexagonalPrismCage: Cage
export function HexagonalPrismCage() {
if (!hexagonalPrismCage) hexagonalPrismCage = PrismCage(polygon(6, true))
return hexagonalPrismCage
}
\ No newline at end of file
......@@ -7,6 +7,7 @@
import { Vec3 } from 'mol-math/linear-algebra'
import { Primitive, PrimitiveBuilder, createPrimitive } from './primitive';
import { polygon } from './polygon'
import { Cage } from './cage';
const on = Vec3.create(0, 0, -0.5), op = Vec3.create(0, 0, 0.5)
const a = Vec3.zero(), b = Vec3.zero(), c = Vec3.zero(), d = Vec3.zero()
......@@ -59,8 +60,6 @@ export function OctagonalPyramid() {
return octagonalPyramid
}
//
let perforatedOctagonalPyramid: Primitive
export function PerforatedOctagonalPyramid() {
if (!perforatedOctagonalPyramid) {
......@@ -84,4 +83,41 @@ export function PerforatedOctagonalPyramid() {
perforatedOctagonalPyramid = createPrimitive(vertices, indices)
}
return perforatedOctagonalPyramid
}
//
/**
* Create a prism cage
*/
export function PyramidCage(points: ArrayLike<number>): Cage {
const sideCount = points.length / 3
// const count = 4 * sideCount
const vertices: number[] = []
const edges: number[] = []
let offset = 1
vertices.push(op[0], op[1], op[2])
// vertices and side edges
for (let i = 0; i < sideCount; ++i) {
vertices.push(points[i * 3], points[i * 3 + 1], -0.5)
edges.push(0, offset)
offset += 1
}
// bases edges
for (let i = 0; i < sideCount; ++i) {
const ni = (i + 1) % sideCount
edges.push(i + 1, ni + 1)
}
return { vertices, edges }
}
let octagonalPyramidCage: Cage
export function OctagonalPyramidCage() {
if (!octagonalPyramidCage) octagonalPyramidCage = PyramidCage(polygon(8, true))
return octagonalPyramidCage
}
\ No newline at end of file
......@@ -7,6 +7,8 @@
import { Vec3 } from 'mol-math/linear-algebra'
import { Primitive, PrimitiveBuilder } from './primitive';
import { polygon } from './polygon'
import { PrismCage } from './prism';
import { Cage } from './cage';
const a = Vec3.zero(), b = Vec3.zero(), c = Vec3.zero(), d = Vec3.zero()
const points = polygon(3, false)
......@@ -45,4 +47,10 @@ let wedge: Primitive
export function Wedge() {
if (!wedge) wedge = createWedge()
return wedge
}
let wedgeCage: Cage
export function WedgeCage() {
if (!wedgeCage) wedgeCage = PrismCage(points)
return wedgeCage
}
\ No newline at end of file
......@@ -13,6 +13,7 @@ import { Representation } from 'mol-repr/representation';
import { Color } from 'mol-util/color';
import { createRenderObject } from 'mol-gl/render-object';
import { SpikedBall } from 'mol-geo/primitive/spiked-ball';
import { HexagonalPrismCage } from 'mol-geo/primitive/prism';
const parent = document.getElementById('app')!
parent.style.width = '100%'
......@@ -28,8 +29,14 @@ canvas3d.animate()
function meshRepr() {
const builderState = MeshBuilder.createState()
const t = Mat4.identity()
MeshBuilder.addPrimitive(builderState, t, SpikedBall(3))
MeshBuilder.addCage(builderState, t, HexagonalPrismCage(), 0.005, 2)
const t2 = Mat4.identity()
Mat4.scaleUniformly(t2, t2, 0.1)
MeshBuilder.addPrimitive(builderState, t2, SpikedBall(3))
const mesh = MeshBuilder.getMesh(builderState)
const values = Mesh.Utils.createValuesSimple(mesh, {}, Color(0xFF0000), 1)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment