PageSourceSearch

https://docs-vrgeo-version3.netlify.app/assets/js/382a62f4.7adeb709.js

js docs-vrgeo-version3.netlify.app collected 2026-10-03 10:42:50 UTC 24,096 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkvrgs_docs_v_3_1=globalThis.webpackChunkvrgs_docs_v_3_1||[]).push([[27243],{73529(e,t,n){n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"general/fractures-structure/implicit-surfaces","title":"Implicit Surfaces from a 3D Potential Field","description":"Building surfaces from a 3D potential field, so horizons can fold and overturn \u2014 and conformable stacks, where several horizons share one field and can never cross.","source":"@site/versioned_docs/version-3.4/general/fractures-structure/implicit-surfaces.md","sourceDirName":"general/fractures-structure","slug":"/general/fractures-structure/implicit-surfaces","permalink":"/docs/general/fractures-structure/implicit-surfaces","draft":false,"unlisted":false,"editUrl":"https://github.com/vrgeoscience/vrgs_docs_v3/tree/master/versioned_docs/version-3.4/general/fractures-structure/implicit-surfaces.md","tags":[],"version":"3.4","sidebarPosition":9,"frontMatter":{"title":"Implicit Surfaces from a 3D Potential Field","description":"Building surfaces from a 3D potential field, so horizons can fold and overturn \u2014 and conformable stacks, where several horizons share one field and can never cross.","metaTitle":"Implicit Surface Modelling (3D)","metaDescription":"Modelling overturned and recumbent folds in VRGS as isosurfaces of a kriged 3D potential field, driven by digitised contacts and dip measurements.","sidebar_label":"Implicit Surfaces (3D)","sidebar_position":9},"sidebar":"docs","previous":{"title":"Surface Gridding (Kriging)","permalink":"/docs/general/fractures-structure/surface-gridding"},"next":{"title":"Geopolygons, Fill & Volume","permalink":"/docs/general/fractures-structure/geopolygon-user-guide"}}');var r=n(74848),i=n(28453);const a={title:"Implicit Surfaces from a 3D Potential Field",description:"Building surfaces from a 3D potential field, so horizons can fold and overturn \u2014 and conformable stacks, where several horizons share one field and can never cross.",metaTitle:"Implicit Surface Modelling (3D)",metaDescription:"Modelling overturned and recumbent folds in VRGS as isosurfaces of a kriged 3D potential field, driven by digitised contacts and dip measurements.",sidebar_label:"Implicit Surfaces (3D)",sidebar_position:9},o="Implicit Surfaces from a 3D Potential Field",l={},d=[{value:"Conformable stacks: several horizons, one field",id:"conformable-stacks-several-horizons-one-field",level:2},{value:"Dip measurements are required",id:"dip-measurements-are-required",level:2},{value:"Which way is up: pole polarity",id:"which-way-is-up-pole-polarity",level:2},{value:"The generated mesh",id:"the-generated-mesh",level:2},{value:"Properties",id:"properties",level:2},{value:"Field",id:"field",level:3},{value:"Sampling",id:"sampling",level:3},{value:"Fit",id:"fit",level:3},{value:"How it works",id:"how-it-works",level:2},{value:"Using an implicit surface with a DFN",id:"using-an-implicit-surface-with-a-dfn",level:2},{value:"Tips",id:"tips",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"implicit-surfaces-from-a-3d-potential-field",children:"Implicit Surfaces from a 3D Potential Field"})}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/docs/general/fractures-structure/surface-gridding",children:"Surface gridding"})," interpolates a height \u2014 a surface of\nthe form ",(0,r.jsx)(t.em,{children:"z = f(x, y)"})," in a tilted frame. That is the right tool for most\nhorizons, but it has one limit that no amount of tuning removes: a map position\nhas exactly one elevation, so a surface that ",(0,r.jsx)(t.strong,{children:"doubles back over itself"})," cannot\nbe written down at all."]}),"\n",(0,r.jsxs)(t.p,{children:["Implicit surface modelling removes that limit. Instead of interpolating a\nheight, VRGS interpolates a scalar ",(0,r.jsx)(t.strong,{children:"potential"})," through 3D space and draws the\nsurface where that potential takes a chosen value. A level set of a 3D field has\nno preferred axis, so an overturned limb is simply another part of the same\nsurface."]}),"\n",(0,r.jsx)(t.p,{children:"Use it when the geology folds back on itself:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Overturned folds"})," \u2014 the same horizon appears twice, one above the other."]}
1),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Recumbent folds"})," \u2014 a fold closure that a height field would flatten."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Vertical and beyond-vertical beds"})," \u2014 no tilted frame to set up."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For an upright, single-valued horizon the ",(0,r.jsx)(t.a,{href:"/docs/general/fractures-structure/surface-gridding",children:"gridded\nsurface"})," is usually the better choice: it is faster, has\nfewer controls, and reports its uncertainty in metres."]}),"\n",(0,r.jsxs)(t.admonition,{title:"Quick start",type:"tip",children:[(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Interpretation Tree"}),", Ctrl-select a ",(0,r.jsx)(t.strong,{children:"polyline group"})," ",(0,r.jsx)(t.em,{children:"and"})," a\n",(0,r.jsx)(t.strong,{children:"structural measurement group"}),", then right-click the polyline group and choose\n",(0,r.jsx)(t.strong,{children:"Convert to Implicit Surface (3D)"}),". A mesh named ",(0,r.jsx)(t.em,{children:"Implicit Surface"})," appears in\nthe project tree."]}),(0,r.jsxs)(t.p,{children:["Ctrl-select ",(0,r.jsx)(t.strong,{children:"several polyline groups"})," \u2014 one per horizon \u2014 and the same command\nbuilds a ",(0,r.jsx)(t.strong,{children:"conformable stack"}),": one surface per group, all modelled together."]})]}),"\n",(0,r.jsx)(t.h2,{id:"conformable-stacks-several-horizons-one-field",children:"Conformable stacks: several horizons, one field"}),"\n",(0,r.jsxs)(t.p,{children:["Select more than one polyline group and each becomes a horizon of the same\nmodel: every group gets its own mesh, but all of them are level sets of ",(0,r.jsx)(t.strong,{children:"one\nshared potential field"}),". That sharing is the point \u2014 the horizons inherit each\nother's shape, so a fold measured on one horizon folds every horizon, thinly\nsampled units borrow their geometry from well-sampled neighbours, and no two\nsurfaces of the stack can ever cross. Dip measurements apply to the whole stack,\nso measurements beside any one horizon shape all of them."]}),"\n",(0,r.jsxs)(t.p,{children:["Because the stack is conformable ",(0,r.jsx)(t.em,{children:"by construction"}),", this is the right tool for a\nstratigraphic succession and the wrong one for an unconformity or an intrusion \u2014\nsurfaces that genuinely truncate one another need separate fields, so build\nthose as separate implicit surfaces."]}),"\n",(0,r.jsxs)(t.p,{children:["Each surface of a stack lists its companions as ",(0,r.jsx)(t.strong,{children:"Co-Horizons"})," in the\nProperties panel, keeps its own colour, attributes and DFN binding, and rebuilds\nautomatically when ",(0,r.jsx)(t.em,{children:"any"})," horizon of the stack is edited \u2014 the shared field means\na change to one horizon legitimately moves the others. Deleting one mesh of the\nstack leaves the rest intact; deleting a horizon's polyline ",(0,r.jsx)(t.em,{children:"group"})," drops that\nhorizon from the field on the next rebuild, with a warning in the log."]}),"\n",(0,r.jsx)(t.h2,{id:"dip-measurements-are-required",children:"Dip measurements are required"}),"\n",(0,r.jsxs)(t.p,{children:["Unlike gridding, orientations are ",(0,r.jsx)(t.strong,{children:"not optional here"})," \u2014 the command refuses to\nrun without them."]}),"\n",(0,r.jsxs)(t.p,{children:["The reason is worth understanding, because it explains the whole method.\nDigitised contacts do not tell VRGS what the potential ",(0,r.jsx)(t.em,{children:"is"})," anywhere; they only\nsay that every point on one contact shares the same value. A completely flat,\nfeatureless field satisfies that perfectly well. It is the dip measurements that\ngive the field a direction and a scale, and so give the surface its shape."]}),"\n",(0,r.jsx)(t.p,{children:"One measurement is enough to produce a surface, though a fold needs enough\nreadings to trace the shape round the hinge."}),"\n",(0,r.jsxs)(t.p,{children:["If a horizon was digitised with no measurements beside it, you can still supply\none by hand: ",(0,r.jsx)(t.strong,{children:"Copy Orientation"})," from any structural measurement, then use\n",(0,r.jsx)(t.strong,{children:"Surface Generator \u2192 Paste Orientation"})," on the mesh. The pasted dip is applied\nat the centre of the contact data."]}),"\n",(0,r.jsx)(t.h2,{id:"which-way-is-up-pole-polarity",children:"Which way is up: pole polarity"}),"\n",(0,r.jsx)(t.p,{children:"This is the one part of implicit modelling that needs judgement, and it is worth\nreading before trusting a folded surface."}),"\n",(0,r.jsxs)(t.p,{children:["A structural measurement records a ",(0,r.jsx)(t.strong,{children:"dip and a dip direction"}),". That notation\ncannot express an overturned bed \u2014 dip is conventionally 0\u201390\xb0, so the normal it\nimplies always points upwards. On an overturned limb the ",(0,r.jsx)(t.em,{children:"stratigraphic"})," up\npoints downwards, so the recorded measurement is the exact opposite of what the\nmodel needs. Nothing in the measurement records younging, so the information is\ngenuinely n
1ot in the data."]}),"\n",(0,r.jsxs)(t.p,{children:["VRGS therefore infers it. ",(0,r.jsx)(t.strong,{children:"Auto-orient Poles"})," (on by default) links each\nmeasurement to its neighbours and propagates polarity between them, flipping any\nreading that disagrees with the ones around it. This works because a surface\nthat doubles back must pass through vertical somewhere, and that is exactly\nwhere the recorded measurement jumps by 180\xb0 while the real surface turns\nsmoothly."]}),"\n",(0,r.jsx)(t.p,{children:"It is an inference, not a fact, so the Properties panel reports how much to\ntrust it:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Reported value"}),(0,r.jsx)(t.th,{children:"What it means"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Poles Flipped"})}),(0,r.jsxs)(t.td,{children:["How many measurements were treated as overturned. On an upright structure this should be ",(0,r.jsx)(t.code,{children:"0"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Worst Polarity Angle"})}),(0,r.jsx)(t.td,{children:"The largest disagreement left between neighbouring measurements, in degrees. Approaching 90\xb0 means the polarity was close to a coin toss."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Widest Polarity Gap"})}),(0,r.jsx)(t.td,{children:"How far the polarity had to be carried across bare ground, as a multiple of the typical station spacing. A large value means it crossed a stretch nobody measured."})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"Both warnings also appear in the message log."}),"\n",(0,r.jsx)(t.admonition,{title:"Sparse measurements are genuinely ambiguous",type:"caution",children:(0,r.jsxs)(t.p,{children:["A steeply folded syncline sampled only on its two limbs looks identical to an\noverturned fold. If the surface comes out inside out, untick ",(0,r.jsx)(t.strong,{children:"Auto-orient\nPoles"})," to use the measurements exactly as recorded, or tick ",(0,r.jsx)(t.strong,{children:"Invert All\nPoles"})," to flip the whole field. Measuring through the hinge is the real fix."]})}),"\n",(0,r.jsx)(t.h2,{id:"the-generated-mesh",children:"The generated mesh"}),"\n",(0,r.jsxs)(t.p,{children:["The surface behaves like a gridded one: it stays linked to its source groups,\n",(0,r.jsx)(t.strong,{children:"regenerates automatically"})," when they change, and is saved with the project.\nRight-click it for the ",(0,r.jsx)(t.strong,{children:"Surface Generator"})," submenu (",(0,r.jsx)(t.strong,{children:"Regenerate"}),", ",(0,r.jsx)(t.strong,{children:"Paste\nOrientation"}),")."]}),"\n",(0,r.jsxs)(t.p,{children:["Because the field is sampled on a 3D voxel grid rather than a 2D lattice,\nrebuilds cost noticeably more than gridding does \u2014 seconds rather than an\ninstant, and the application is busy while it works. Raise ",(0,r.jsx)(t.strong,{children:"Voxel Budget"})," only\nwhen you need the extra detail \u2014 and untick ",(0,r.jsx)(t.strong,{children:"Auto Rebuild"})," in the surface's\nproperties while editing the source interpretation, so each digitised vertex\ndoes not cost a full re-solve. The edits are remembered, and one rebuild\ncatches up when it is re-ticked (or on ",(0,r.jsx)(t.strong,{children:"Regenerate"}),")."]}),"\n",(0,r.jsx)(t.h2,{id:"properties",children:"Properties"}),"\n",(0,r.jsx)(t.p,{children:"Select the mesh and edit its parameters in the Properties panel."}),"\n",(0,r.jsx)(t.h3,{id:"field",children:"Field"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Property"}),(0,r.jsx)(t.th,{children:"Meaning"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Biharmonic Kernel"})}),(0,r.jsxs)(t.td,{children:["The extrapolating kernel. With it off (the default), a measurement's influence stops dead at one ",(0,r.jsx)(t.strong,{children:"Range"})," and beyond the data the surface relaxes back to the fitted regional trend \u2014 a dipping surface visibly flattens, or flares back up, at the edges. With it on, dips carry outward 
1indefinitely and the edges keep dipping. Evaluation is somewhat slower, and ",(0,r.jsx)(t.strong,{children:"Range"})," has no effect on the shape."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Range"})}),(0,r.jsxs)(t.td,{children:["Correlation range in metres \u2014 how far a measurement's influence reaches with the standard (cubic) kernel; influence stops entirely beyond it, so larger extrapolates further. Derived from the data diagonal on the first build, then yours to change. Ignored by the ",(0,r.jsx)(t.strong,{children:"Biharmonic Kernel"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Nugget"})}),(0,r.jsxs)(t.td,{children:["Slack on the contact points, as a fraction of the field variance. ",(0,r.jsx)(t.code,{children:"0"})," puts the surface exactly through the digitised points; raise it to smooth through digitising noise."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Orientation Nugget"})}),(0,r.jsxs)(t.td,{children:["Slack on the dip measurements (default ",(0,r.jsx)(t.code,{children:"0.01"}),"). Compass readings are good to a few degrees, so honouring them exactly over-fits. Raise it if the surface undulates between stations."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Drift Degree"})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"1"})," for a planar regional trend, ",(0,r.jsx)(t.code,{children:"2"})," for a curved one. Reduced automatically if the data cannot support the higher degree."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Point Spacing"})}),(0,r.jsx)(t.td,{children:"Digitised vertices closer together than this are merged before solving. Raise it if the solve is refused as too large."})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"sampling",children:"Sampling"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Property"}),(0,r.jsx)(t.th,{children:"Meaning"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Voxel Budget"})}),(0,r.jsxs)(t.td,{children:["How many voxels the field is sampled on (default 2,000,000, about 128\xb3). Detail improves with the ",(0,r.jsx)(t.em,{children:"cube root"})," of this \u2014 and so does the wait."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Padding"})}),(0,r.jsx)(t.td,{children:"How far the sampled box extends beyond the data, as a fraction of its longest side. Gives the surface room to curve past the outermost measurement."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Max Distance From Data"})}),(0,r.jsxs)(t.td,{children:["Trim surface further than this from any control point. ",(0,r.jsx)(t.code,{children:"0"})," keeps the whole sheet, which extends to the edge of the sampled box; a negative value re-derives the distance on the next build (the default for new surfaces, so the pure-extrapolation apron is trimmed automatically). Surfaces from older projects reload untrimmed."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:"Voxel Size"}),", ",(0,r.jsx)(t.strong,{children:"Triangles"})]}),(0,r.jsx)(t.td,{children:"Reported from the last build; not editable."})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"fit",children:"Fit"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Property"}),(0,r.jsx)(t.th,{children:"Meaning"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Contact Points"})}),(0,r.jsxs)(t.td,{children:["How many contact points were used, after merging by ",(0,r.jsx)(t.strong,{children:"Point Spacing"})," \u2014 across every horizon of a stack."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Co-Horizons"})}),(0,r.jsx)(t.td,{children:"The other horizons solved into this surface's shared field (only shown for a conformable stack)."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Surface Misfit"})}),(0,r.jsxs)(t.td,{children:["How far the surfaces miss the stack's contact points, ",(0,r.jsx)(t.strong,{children:"in metres"})," (median). Zero unless a ",(0,r.jsx)(t.strong,{children:"Nugget"})," was set."]})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"how-it-works",children:"How it works"}),"\n",(0,r.jsx)(t.p,{children:'Contact points enter the system as statements that two points share a potential,\nnot as values \u2014 which is what lets the method work without knowing what the\npotential "is". Dip measurements enter as gradient constraints on the field,\nusing the same cubic covariance model as dip-constrained gridding, extended to\nthree dimensions. A linear (or quadratic) drift lets the surface follow and\nextrapolate a regi
1onal trend rather than flattening away from the data.'}),"\n",(0,r.jsxs)(t.p,{children:["The cubic covariance has ",(0,r.jsx)(t.em,{children:"compact support"}),": beyond one ",(0,r.jsx)(t.strong,{children:"Range"})," of the data\nthe field is exactly the drift, so the surface there is the fitted trend and\nnothing else. The ",(0,r.jsx)(t.strong,{children:"Biharmonic Kernel"})," swaps in a globally supported\ncovariance (the kind used by dedicated implicit-modelling packages), whose\ngradient influence never dies out \u2014 that is why it extrapolates dips instead\nof relaxing to the trend, and why it costs more to evaluate."]}),"\n",(0,r.jsx)(t.p,{children:"The solved field is then sampled over a 3D voxel grid and the surface extracted\nwhere the potential equals its value on the contact. Surface normals come from\nthe field's own gradient rather than from the triangles, so shading stays smooth\nhowever coarse the sampling."}),"\n",(0,r.jsx)(t.h2,{id:"using-an-implicit-surface-with-a-dfn",children:"Using an implicit surface with a DFN"}),"\n",(0,r.jsx)(t.p,{children:"An implicit surface can be attached to a DFN as an upper limit, a lower limit or\nan internal barrier, exactly as a gridded one can. That is how bed-confined\n(stratabound) fracturing is modelled: model the top and base of the bed, attach\nboth, and fracture height follows bed thickness."}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-user-guide#model-surfaces",children:"Model Surfaces"})," section of the DFN guide\nis the authority on how each kind of surface is handled and which are accepted \u2014\nread it before attaching a folded surface. A surface the DFN cannot use is\nrefused with a message explaining why, rather than silently approximated: a\nmis-signed bed boundary would put fractures on the wrong side of a contact with\nnothing downstream revealing the error."]}),"\n",(0,r.jsx)(t.h2,{id:"tips",children:"Tips"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:'"An implicit surface needs at least one orientation measurement"'})," \u2014 the\npolyline group was selected without a measurement group. Ctrl-select both, or\npaste an orientation onto an existing surface."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"The surface is inside out"})," \u2014 polarity. Tick ",(0,r.jsx)(t.strong,{children:"Invert All Poles"}),", or check\n",(0,r.jsx)(t.strong,{children:"Poles Flipped"})," and ",(0,r.jsx)(t.strong,{children:"Widest Polarity Gap"})," to see how confident the\ninference was."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"The fold closure is squared off or lumpy"})," \u2014 raise ",(0,r.jsx)(t.strong,{children:"Voxel Budget"}),". The\nsurface can only be as sharp as the grid it was sampled on."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"The surface flattens or flares back up at the edges of the data"})," \u2014 the\ncubic kernel handing over to the regional trend. Tick ",(0,r.jsx)(t.strong,{children:"Biharmonic Kernel"}),"\nso the dips carry outward, or raise ",(0,r.jsx)(t.strong,{children:"Range"})," so the data stays in control\nfurther out."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"The surface extends far past the outcrop"})," \u2014 lower ",(0,r.jsx)(t.strong,{children:"Max Distance From\nData"})," (new surfaces trim automatically; set ",(0,r.jsx)(t.code,{children:"0"})," to keep the whole sheet).\nThe field extrapolates its trend indefinitely by design, which is useful for\nprojecting and unhelpful for a figure."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"The surface bulges between measurements"})," \u2014 raise ",(0,r.jsx)(t.strong,{children:"Orientation Nugget"}),",\nand check for a reading whose polarity was flipped when it should not have\nbeen."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Rebuilds are slow"})," \u2014 lower ",(0,r.jsx)(t.strong,{children:"Voxel Budget"}),", or raise ",(0,r.jsx)(t.strong,{children:"Point Spacing"})," so\nfewer contact points enter the solve."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:'"Too many constraints for a dense solve"'})," \u2014 raise ",(0,r.jsx)(t.strong,{children:"Point Spacing"}),".\nDensely digitised lines carry far more vertices than the surface shape needs."]}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},28453(e,t,n){n.d(t,{R:()=>a,x:()=>o});var s=n(96540);const r={},i=s.createContext(r);function a(e){const t=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.