u003c!u002du002d =========================nVVSMASTER.NO – TAKVINKEL-KALKULATOR (ALT-I-ETT)n- tan(v) = motstående / nærståenden- v = arctan(motstående / nærstående)n- hypotenus (takflate) = √(mot² + nær²)n- Live SVG i kalkulatorn- PDF/print via hidden IFRAME (løser about:blank)n- PDF inkluderer illustrasjon + målstreker/piler + logo (valgfri)n========================= u002du002du003ennu003cdiv class=u0022vvsm-roof-wrapu0022 id=u0022vvsmRoofAngleCalcu0022u003en u003cstyleu003en .vvsm-roof-wrap{font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;line-height:1.35}n .vvsm-roof-card{max-width:980px;margin:18px auto;padding:18px;border:1px solid rgba(0,0,0,.08);border-radius:14px;background:#fff;box-shadow:0 8px 30px rgba(0,0,0,.06)}n .vvsm-roof-head{display:flex;gap:14px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap}n .vvsm-roof-title{margin:0;font-size:22px}n .vvsm-roof-sub{margin:6px 0 0;color:rgba(0,0,0,.65);font-size:14px}n .vvsm-roof-badge{font-size:12px;padding:6px 10px;border-radius:999px;border:1px solid rgba(0,0,0,.10);background:rgba(0,0,0,.03)}n .vvsm-roof-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}n @media (max-width:720px){.vvsm-roof-grid{grid-template-columns:1fr}}n .vvsm-roof-field{padding:12px;border:1px solid rgba(0,0,0,.10);border-radius:12px;background:rgba(0,0,0,.015)}n .vvsm-roof-label{display:flex;align-items:baseline;justify-content:space-between;gap:10px}n .vvsm-roof-label b{font-size:14px}n .vvsm-roof-hint{margin:6px 0 0;color:rgba(0,0,0,.6);font-size:12px}n .vvsm-roof-row{display:grid;grid-template-columns:1fr 140px;gap:10px;margin-top:10px}n .vvsm-roof-row input,.vvsm-roof-row select{n width:100%;padding:10px 12px;border-radius:10px;border:1px solid rgba(0,0,0,.14);background:#fff;font-size:15pxn }n .vvsm-roof-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}n .vvsm-roof-btn{appearance:none;border:1px solid rgba(0,0,0,.14);background:#fff;padding:10px 12px;border-radius:12px;font-weight:800;cursor:pointer}n .vvsm-roof-btn.primary{border-color:rgba(0,0,0,.18);background:rgba(0,0,0,.06)}n .vvsm-roof-btn:active{transform:translateY(1px)}n .vvsm-roof-out{margin-top:14px;padding:14px;border-radius:12px;border:1px solid rgba(0,0,0,.10);background:rgba(0,0,0,.02)}n .vvsm-roof-out h3{margin:0 0 8px;font-size:16px}n .vvsm-roof-kv{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}n @media (max-width:720px){.vvsm-roof-kv{grid-template-columns:1fr}}n .vvsm-roof-kv .k{color:rgba(0,0,0,.7);font-size:12px}n .vvsm-roof-kv .v{font-size:18px;font-weight:900}n .vvsm-roof-warn{margin-top:10px;font-size:13px;color:#7a3b00;background:#fff7e6;border:1px solid #ffe2b0;padding:10px;border-radius:10px;display:none}n .vvsm-roof-mini{margin-top:10px;border:1px dashed rgba(0,0,0,.18);border-radius:12px;padding:12px;background:#fff}n .vvsm-roof-mini h4{margin:0 0 8px;font-size:14px}n .vvsm-roof-mini table{width:100%;border-collapse:collapse}n .vvsm-roof-mini td{padding:8px 6px;border-top:1px solid rgba(0,0,0,.06);font-size:13px}n .vvsm-roof-mini td:last-child{text-align:right;font-weight:800}n .vvsm-roof-bilag{margin-top:14px}n .vvsm-roof-bilag details{border:1px dashed rgba(0,0,0,.18);border-radius:12px;padding:12px;background:#fff}n .vvsm-roof-bilag summary{cursor:pointer;font-weight:900}n .vvsm-roof-bilag-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:10px}n @media (max-width:720px){.vvsm-roof-bilag-grid{grid-template-columns:1fr}}n .vvsm-roof-bilag-grid input{width:100%;padding:10px 12px;border-radius:10px;border:1px solid rgba(0,0,0,.14)}n .vvsm-roof-foot{margin-top:10px;color:rgba(0,0,0,.55);font-size:12px}n u003c/styleu003enn u003cdiv class=u0022vvsm-roof-cardu0022u003en u003cdiv class=u0022vvsm-roof-headu0022u003en u003cdivu003en u003ch2 class=u0022vvsm-roof-titleu0022u003eTakvinkelu003c/h2u003en u003cp class=u0022vvsm-roof-subu0022u003eLegg inn u003cbu003emotståendeu003c/bu003e (høyde) og u003cbu003enærståendeu003c/bu003e (horisontal lengde). Kalkulatoren gir vinkel, fall og takflate (hypotenus).u003c/pu003en u003c/divu003en u003cdiv class=u0022vvsm-roof-badgeu0022u003etan(v) = motstående / nærståendeu003c/divu003en u003c/divu003enn u003cdiv class=u0022vvsm-roof-gridu0022u003en u003cdiv class=u0022vvsm-roof-fieldu0022u003en u003cdiv class=u0022vvsm-roof-labelu0022u003eu003cbu003eMotstående katetu003c/bu003eu003cspanu003ehøydeu003c/spanu003eu003c/divu003en u003cdiv class=u0022vvsm-roof-rowu0022u003en u003cinput id=u0022opp_inu0022 inputmode=u0022decimalu0022 placeholder=u0022f.eks. 1,2u0022 /u003en u003cselect id=u0022opp_unitu0022u003en u003coption value=u00221u0022u003emeter (m)u003c/optionu003en u003coption value=u00220.01u0022u003ecentimeter (cm)u003c/optionu003en u003coption value=u00220.001u0022u003emillimeter (mm)u003c/optionu003en u003c/selectu003en u003c/divu003en u003cdiv class=u0022vvsm-roof-hintu0022u003eHøydeforskjellen (løft).u003c/divu003en u003c/divu003enn u003cdiv class=u0022vvsm-roof-fieldu0022u003en u003cdiv class=u0022vvsm-roof-labelu0022u003eu003cbu003eNærstående katetu003c/bu003eu003cspanu003elengdeu003c/spanu003eu003c/divu003en u003cdiv class=u0022vvsm-roof-rowu0022u003en u003cinput id=u0022adj_inu0022 inputmode=u0022decimalu0022 placeholder=u0022f.eks. 4,0u0022 /u003en u003cselect id=u0022adj_unitu0022u003en u003coption value=u00221u0022u003emeter (m)u003c/optionu003en u003coption value=u00220.01u0022u003ecentimeter (cm)u003c/optionu003en u003coption value=u00220.001u0022u003emillimeter (mm)u003c/optionu003en u003c/selectu003en u003c/divu003en u003cdiv class=u0022vvsm-roof-hintu0022u003eHorisontal lengde (løp).u003c/divu003en u003c/divu003en u003c/divu003enn u003cdiv class=u0022vvsm-roof-actionsu0022u003en u003cbutton class=u0022vvsm-roof-btn primaryu0022 id=u0022calcBtnu0022 type=u0022buttonu0022u003eBeregnu003c/buttonu003en u003cbutton class=u0022vvsm-roof-btnu0022 id=u0022resetBtnu0022 type=u0022buttonu0022u003eNullstillu003c/buttonu003en u003cbutton class=u0022vvsm-roof-btnu0022 id=u0022copyBtnu0022 type=u0022buttonu0022u003eKopier resultatu003c/buttonu003en u003cbutton class=u0022vvsm-roof-btnu0022 id=u0022printBtnu0022 type=u0022buttonu0022u003eUtskrift / PDF (bilag)u003c/buttonu003en u003c/divu003enn u003c!u002du002d Live illustrasjon u002du002du003en u003cdiv class=u0022vvsm-roof-miniu0022 id=u0022triCardu0022 style=u0022margin-top:14pxu0022u003en u003ch4u003eIllustrasjon (oppdateres automatisk)u003c/h4u003enn u003csvg id=u0022roofTriSvgu0022 viewBox=u00220 0 640 280u0022 width=u0022100%u0022 height=u0022autou0022 role=u0022imgu0022 aria-label=u0022Rettvinklet trekant for takvinkelu0022u003en u003cpolyline points=u002290,230 520,230 520,70 90,230u0022n fill=u0022rgba(0,0,0,.04)u0022 stroke=u0022rgba(0,0,0,.45)u0022 stroke-width=u00223u0022 /u003en u003cpath d=u0022M 490 230 L 490 200 L 520 200u0022 fill=u0022noneu0022 stroke=u0022rgba(0,0,0,.55)u0022 stroke-width=u00223u0022/u003enn u003c!u002du002d enkle målstreker u002du002du003en u003cpath d=u0022M 90 245 L 520 245u0022 stroke=u0022rgba(0,0,0,.25)u0022 stroke-width=u00222u0022/u003en u003cpath d=u0022M 90 240 L 90 250u0022 stroke=u0022rgba(0,0,0,.25)u0022 stroke-width=u00222u0022/u003en u003cpath d=u0022M 520 240 L 520 250u0022 stroke=u0022rgba(0,0,0,.25)u0022 stroke-width=u00222u0022/u003enn u003cpath d=u0022M 535 230 L 535 70u0022 stroke=u0022rgba(0,0,0,.25)u0022 stroke-width=u00222u0022/u003en u003cpath d=u0022M 530 230 L 540 230u0022 stroke=u0022rgba(0,0,0,.25)u0022 stroke-width=u00222u0022/u003en u003cpath d=u0022M 530 70 L 540 70u0022 stroke=u0022rgba(0,0,0,.25)u0022 stroke-width=u00222u0022/u003enn u003ctext x=u0022305u0022 y=u0022265u0022 font-size=u002214u0022 fill=u0022rgba(0,0,0,.72)u0022u003eNærstående (løp)u003c/textu003en u003ctext x=u0022555u0022 y=u0022155u0022 font-size=u002214u0022 fill=u0022rgba(0,0,0,.72)u0022 transform=u0022rotate(-90 555 155)u0022u003eMotstående (løft)u003c/textu003enn u003ctext id=u0022lblAdju0022 x=u0022305u0022 y=u0022236u0022 font-size=u002218u0022 font-weight=u0022800u0022 text-anchor=u0022middleu0022 fill=u0022rgba(0,0,0,.92)u0022u003e—u003c/textu003en u003ctext id=u0022lblOppu0022 x=u0022565u0022 y=u0022150u0022 font-size=u002218u0022 font-weight=u0022800u0022 text-anchor=u0022middleu0022 fill=u0022rgba(0,0,0,.92)u0022u003e—u003c/textu003enn u003ctext id=u0022lblHypu0022 x=u0022290u0022 y=u0022120u0022 font-size=u002218u0022 font-weight=u0022900u0022 text-anchor=u0022middleu0022n fill=u0022rgba(0,0,0,.92)u0022 transform=u0022rotate(-23 290 120)u0022u003e—u003c/textu003en u003ctext x=u0022275u0022 y=u0022145u0022 font-size=u002213u0022 fill=u0022rgba(0,0,0,.72)u0022 transform=u0022rotate(-23 275 145)u0022u003eTakflate (hypotenus)u003c/textu003enn u003cpath id=u0022angleArcu0022 d=u0022M 120 230 A 80 80 0 0 1 170 190u0022 fill=u0022noneu0022 stroke=u0022rgba(0,0,0,.55)u0022 stroke-width=u00224u0022/u003en u003ctext id=u0022lblDegu0022 x=u0022165u0022 y=u0022212u0022 font-size=u002218u0022 font-weight=u0022900u0022 fill=u0022rgba(0,0,0,.92)u0022u003ev = —u003c/textu003enn u003ctext x=u002290u0022 y=u002228u0022 font-size=u002216u0022 fill=u0022rgba(0,0,0,.72)u0022u003etan(v) = motstående / nærståendeu003c/textu003en u003ctext x=u002290u0022 y=u002250u0022 font-size=u002215u0022 fill=u0022rgba(0,0,0,.65)u0022u003ehypotenus = √(motstående² + nærstående²)u003c/textu003en u003c/svgu003enn u003cdiv style=u0022margin-top:8px;color:rgba(0,0,0,.62);font-size:12pxu0022u003en Tips: Takflatelengden er hypotenusen (skrå lengde). Den beregnes med Pythagoras.n u003c/divu003en u003c/divu003enn u003cdiv class=u0022vvsm-roof-outu0022 aria-live=u0022politeu0022u003en u003ch3u003eResultatu003c/h3u003en u003cdiv class=u0022vvsm-roof-kvu0022u003en u003cdivu003eu003cdiv class=u0022ku0022u003eTakvinkelu003c/divu003eu003cdiv class=u0022vu0022 id=u0022out_degu0022u003e—u003c/divu003eu003c/divu003en u003cdivu003eu003cdiv class=u0022ku0022u003eTakfall (prosent)u003c/divu003eu003cdiv class=u0022vu0022 id=u0022out_pctu0022u003e—u003c/divu003eu003c/divu003en u003cdivu003eu003cdiv class=u0022ku0022u003eTakfall (1:x)u003c/divu003eu003cdiv class=u0022vu0022 id=u0022out_ratiou0022u003e—u003c/divu003eu003c/divu003en u003cdivu003eu003cdiv class=u0022ku0022u003ecm per meteru003c/divu003eu003cdiv class=u0022vu0022 id=u0022out_cpmu0022u003e—u003c/divu003eu003c/divu003en u003cdivu003eu003cdiv class=u0022ku0022u003eTakflate (hypotenus)u003c/divu003eu003cdiv class=u0022vu0022 id=u0022out_hypu0022u003e—u003c/divu003eu003c/divu003en u003c/divu003enn u003cdiv class=u0022vvsm-roof-miniu0022 id=u0022detailsu0022 style=u0022display:noneu0022u003en u003ch4u003eDetaljeru003c/h4u003en u003ctableu003en u003ctru003eu003ctdu003eMotstående (m)u003c/tdu003eu003ctd id=u0022d_oppu0022u003e—u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eNærstående (m)u003c/tdu003eu003ctd id=u0022d_adju0022u003e—u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eHypotenus (m)u003c/tdu003eu003ctd id=u0022d_hypu0022u003e—u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003etan(v)u003c/tdu003eu003ctd id=u0022d_tanu0022u003e—u003c/tdu003eu003c/tru003en u003c/tableu003en u003c/divu003enn u003cdiv class=u0022vvsm-roof-warnu0022 id=u0022warnu0022u003eu003c/divu003en u003cdiv class=u0022vvsm-roof-footu0022u003eTips: Takfall % = (motstående / nærstående) · 100.u003c/divu003en u003c/divu003enn u003cdiv class=u0022vvsm-roof-bilagu0022u003en u003cdetailsu003en u003csummaryu003eBilaginfo (valgfritt, anbefalt for PDF)u003c/summaryu003en u003cdiv class=u0022vvsm-roof-bilag-gridu0022u003en u003cinput id=u0022bilag_kundeu0022 placeholder=u0022Kunde / mottaker (navn)u0022 /u003en u003cinput id=u0022bilag_prosjektu0022 placeholder=u0022Prosjekt / adresseu0022 /u003en u003cinput id=u0022bilag_refu0022 placeholder=u0022Referanse / meldingu0022 /u003en u003cinput id=u0022bilag_bilagsnru0022 placeholder=u0022Bilagsnummer (tomt = auto)u0022 /u003en u003c/divu003en u003cdiv class=u0022vvsm-roof-footu0022u003eBilaget er dokumentasjon på beregning (ikke faktura).u003c/divu003en u003c/detailsu003en u003c/divu003en u003c/divu003enn u003cscriptu003en (function(){n const $ = (s)=u003edocument.querySelector(s);nn // TODO: sett inn logo-url hvis du vil ha logo på bilag.n // Hvis du ikke vil ha logo: la den stå tom.n const LOGO_URL = u0022u0022; // f.eks. u0022https://usercontent.one/wp/www.vvsmester.no/wp-content/uploads/2015/08/vvsmester-stor-e1450369747253.gifu0022nn?media=1781027738 const els = {n opp: $(u0022#opp_inu0022), oppU: $(u0022#opp_unitu0022),n adj: $(u0022#adj_inu0022), adjU: $(u0022#adj_unitu0022),n outDeg: $(u0022#out_degu0022),n outPct: $(u0022#out_pctu0022),n outRatio: $(u0022#out_ratiou0022),n outCpm: $(u0022#out_cpmu0022),n outHyp: $(u0022#out_hypu0022),n details: $(u0022#detailsu0022),n dOpp: $(u0022#d_oppu0022),n dAdj: $(u0022#d_adju0022),n dHyp: $(u0022#d_hypu0022),n dTan: $(u0022#d_tanu0022),n warn: $(u0022#warnu0022),n svg: {n lblAdj: $(u0022#lblAdju0022),n lblOpp: $(u0022#lblOppu0022),n lblHyp: $(u0022#lblHypu0022),n lblDeg: $(u0022#lblDegu0022),n angleArc: $(u0022#angleArcu0022),n },n bilag: {n kunde: $(u0022#bilag_kundeu0022),n prosjekt: $(u0022#bilag_prosjektu0022),n ref: $(u0022#bilag_refu0022),n bilagsnr: $(u0022#bilag_bilagsnru0022),n }n };nn function parseNum(v){n const s = String(v ?? u0022u0022).trim().replace(/u005cs+/g,u0022u0022).replace(u0022,u0022,u0022.u0022);n if(!s) return null;n const n = Number(s);n return Number.isFinite(n) ? n : null;n }nn function fmt(n, unit, d=2){n if(n==null || !Number.isFinite(n)) return u0022—u0022;n return n.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:d}) + (unit?(u0022 u0022+unit):u0022u0022);n }nn function autoBilagsnr(){n const d = new Date();n const pad = (n)=u003e String(n).padStart(2,u00220u0022);n const ymd = d.getFullYear()+pad(d.getMonth()+1)+pad(d.getDate());n const rnd = Math.floor(1000 + Math.random()*9000);n return ymd + u0022-u0022 + rnd;n }n function esc(s){ return String(s||u0022u0022).replace(/[u0026u003cu003eu0022]/g, c =u003e ({'u0026':'u0026amp;','u003c':'u0026lt;','u003e':'u0026gt;','u0022':'u0026quot;'}[c])); }nn // ROBUST PRINT: skriv HTML til skjult iframe og print derfra (løser about:blank)n function printHtmlViaIframe(html){n const old = document.getElementById(u0022vvsmPrintFrameu0022);n if(old) old.remove();nn const iframe = document.createElement(u0022iframeu0022);n iframe.id = u0022vvsmPrintFrameu0022;n iframe.style.position = u0022fixedu0022;n iframe.style.right = u00220u0022;n iframe.style.bottom = u00220u0022;n iframe.style.width = u00220u0022;n iframe.style.height = u00220u0022;n iframe.style.border = u00220u0022;n iframe.style.visibility = u0022hiddenu0022;n document.body.appendChild(iframe);nn const doc = iframe.contentWindow.document;n doc.open();n doc.write(html);n doc.close();nn iframe.onload = () =u003e {n try{n iframe.contentWindow.focus();n iframe.contentWindow.print();n }catch(e){n alert(u0022Klarte ikke å åpne utskrift/PDF. Prøv en annen nettleser eller tillat utskrift.u0022);n }n };nn // Safari-fallbackn setTimeout(() =u003e {n try{n iframe.contentWindow.focus();n iframe.contentWindow.print();n }catch(e){}n }, 450);n }nn function updateTriangleViz(data){n if(!data){n if(els.svg?.lblAdj) els.svg.lblAdj.textContent = u0022—u0022;n if(els.svg?.lblOpp) els.svg.lblOpp.textContent = u0022—u0022;n if(els.svg?.lblHyp) els.svg.lblHyp.textContent = u0022—u0022;n if(els.svg?.lblDeg) els.svg.lblDeg.textContent = u0022v = —u0022;n return;n }nn const adjTxt = data.adj.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:3}) + u0022 mu0022;n const oppTxt = data.opp.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:3}) + u0022 mu0022;n const hypTxt = data.hyp.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:3}) + u0022 mu0022;n const degTxt = data.deg.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:2}) + u0022°u0022;nn if(els.svg?.lblAdj) els.svg.lblAdj.textContent = adjTxt;n if(els.svg?.lblOpp) els.svg.lblOpp.textContent = oppTxt;n if(els.svg?.lblHyp) els.svg.lblHyp.textContent = hypTxt;n if(els.svg?.lblDeg) els.svg.lblDeg.textContent = u0022v = u0022 + degTxt;nn const v = Math.max(0, Math.min(70, data.deg));n const r = 80;n const A = {x:90, y:230};n const start = {x:A.x + 30, y:A.y};nn const rad = (v * Math.PI) / 180;n const end = {n x: A.x + 30 + Math.cos(rad) * (r-35),n y: A.y - Math.sin(rad) * (r-35)n };nn if(els.svg?.angleArc){n els.svg.angleArc.setAttribute(u0022du0022, `M ${start.x} ${start.y} A ${r} ${r} 0 0 1 ${end.x} ${end.y}`);n }n }nn function calc(){n els.warn.style.display=u0022noneu0022; els.warn.textContent=u0022u0022;nn const oppIn = parseNum(els.opp.value);n const adjIn = parseNum(els.adj.value);nn if(oppIn==null || adjIn==null){n els.outDeg.textContent=u0022—u0022; els.outPct.textContent=u0022—u0022; els.outRatio.textContent=u0022—u0022; els.outCpm.textContent=u0022—u0022; els.outHyp.textContent=u0022—u0022;n els.details.style.display=u0022noneu0022;n els.warn.textContent=u0022Fyll inn både motstående og nærstående.u0022;n els.warn.style.display=u0022blocku0022;n updateTriangleViz(null);n return null;n }nn const opp = oppIn * Number(els.oppU.value); // metern const adj = adjIn * Number(els.adjU.value); // meternn if(adj u003c= 0){n els.warn.textContent=u0022Nærstående (horisontal lengde) må være større enn 0.u0022;n els.warn.style.display=u0022blocku0022;n updateTriangleViz(null);n return null;n }n if(opp u003c 0){n els.warn.textContent=u0022Motstående (høyde) kan ikke være negativ.u0022;n els.warn.style.display=u0022blocku0022;n updateTriangleViz(null);n return null;n }nn const tanv = opp/adj;n const rad = Math.atan(tanv);n const deg = rad * 180/Math.PI;nn const pct = tanv * 100;n const cmPerM = tanv * 100;n const ratioX = (tanv === 0) ? Infinity : (1/tanv);nn const hyp = Math.sqrt(opp*opp + adj*adj);nn els.outDeg.textContent = fmt(deg,u0022°u0022,2);n els.outPct.textContent = fmt(pct,u0022%u0022,1);n els.outCpm.textContent = fmt(cmPerM,u0022cm/mu0022,1);n els.outRatio.textContent = (tanv===0) ? u00220u0022 : (u00221:u0022 + ratioX.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:2}));n els.outHyp.textContent = fmt(hyp,u0022mu0022,3);nn els.details.style.display=u0022blocku0022;n els.dOpp.textContent = fmt(opp,u0022mu0022,3);n els.dAdj.textContent = fmt(adj,u0022mu0022,3);n els.dHyp.textContent = fmt(hyp,u0022mu0022,3);n els.dTan.textContent = tanv.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:6});nn const data = {opp, adj, hyp, tanv, deg, pct, cmPerM, ratioX};n updateTriangleViz(data);n return data;n }nn function reset(){n els.opp.value=u0022u0022; els.adj.value=u0022u0022;n els.oppU.value=u00221u0022; els.adjU.value=u00221u0022;n Object.values(els.bilag).forEach(x=u003ex.value=u0022u0022);n calc();n }nn async function copyResult(data){n if(!data){ alert(u0022Fyll inn mål først.u0022); return; }n const now = new Date();n const txt = [n u0022Takvinkel – resultatu0022,n u0022Dato: u0022 + now.toLocaleString(u0022nb-NOu0022),n u0022u0022,n u0022Motstående (m): u0022 + data.opp,n u0022Nærstående (m): u0022 + data.adj,n u0022Hypotenus (m): u0022 + data.hyp,n u0022tan(v): u0022 + data.tanv,n u0022Vinkel (grader): u0022 + data.deg,n u0022Takfall (%): u0022 + data.pct,n u0022Takfall (1:x): 1:u0022 + data.ratioX,n u0022cm per meter: u0022 + data.cmPerMn ].join(u0022u005cu005cnu0022);nn try{ await navigator.clipboard.writeText(txt); alert(u0022Resultatet er kopiert.u0022); }n catch(e){n const ta=document.createElement(u0022textareau0022);n ta.value=txt; document.body.appendChild(ta);n ta.select(); document.execCommand(u0022copyu0022);n document.body.removeChild(ta);n alert(u0022Resultatet er kopiert.u0022);n }n }nn // SVG til bilag (med piler/målstreker) – skalerer pent i printn function buildBilagSVG(data){n const adjTxt = data.adj.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:3}) + u0022 mu0022;n const oppTxt = data.opp.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:3}) + u0022 mu0022;n const hypTxt = data.hyp.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:3}) + u0022 mu0022;n const degTxt = data.deg.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:2}) + u0022°u0022;nn return `nu003csvg viewBox=u00220 0 760 360u0022 width=u0022100%u0022 style=u0022max-width:620pxu0022u003en u003cdefsu003en u003cmarker id=u0022arrowu0022 markerWidth=u002210u0022 markerHeight=u002210u0022 refX=u00228u0022 refY=u00225u0022 orient=u0022autou0022u003en u003cpath d=u0022M0,0 L10,5 L0,10 zu0022 fill=u0022#111u0022/u003en u003c/markeru003en u003c/defsu003enn u003c!u002du002d ramme u002du002du003en u003crect x=u002210u0022 y=u002210u0022 width=u0022740u0022 height=u0022340u0022 rx=u002214u0022 ry=u002214u0022 fill=u0022#fffu0022 stroke=u0022#dddu0022/u003enn u003c!u002du002d trekantpunkter u002du002du003en u003c!u002du002d A(120,290) B(630,290) C(630,90) u002du002du003en u003cpolyline points=u0022120,290 630,290 630,90 120,290u0022n fill=u0022rgba(0,0,0,.03)u0022 stroke=u0022#111u0022 stroke-width=u00223u0022/u003enn u003c!u002du002d rett vinkel u002du002du003en u003cpath d=u0022M 600 290 L 600 255 L 630 255u0022 fill=u0022noneu0022 stroke=u0022#111u0022 stroke-width=u00223u0022/u003enn u003c!u002du002d målstreker / piler u002du002du003en u003c!u002du002d nærstående u002du002du003en u003cline x1=u0022120u0022 y1=u0022315u0022 x2=u0022630u0022 y2=u0022315u0022 stroke=u0022#111u0022 stroke-width=u00222u0022 marker-start=u0022url(#arrow)u0022 marker-end=u0022url(#arrow)u0022/u003en u003cline x1=u0022120u0022 y1=u0022306u0022 x2=u0022120u0022 y2=u0022324u0022 stroke=u0022#111u0022 stroke-width=u00222u0022/u003en u003cline x1=u0022630u0022 y1=u0022306u0022 x2=u0022630u0022 y2=u0022324u0022 stroke=u0022#111u0022 stroke-width=u00222u0022/u003en u003ctext x=u0022375u0022 y=u0022308u0022 text-anchor=u0022middleu0022 font-size=u002218u0022 font-weight=u0022800u0022 fill=u0022#111u0022u003e${adjTxt}u003c/textu003en u003ctext x=u0022375u0022 y=u0022336u0022 text-anchor=u0022middleu0022 font-size=u002214u0022 fill=u0022#444u0022u003eNærstående (løp)u003c/textu003enn u003c!u002du002d motstående u002du002du003en u003cline x1=u0022655u0022 y1=u0022290u0022 x2=u0022655u0022 y2=u002290u0022 stroke=u0022#111u0022 stroke-width=u00222u0022 marker-start=u0022url(#arrow)u0022 marker-end=u0022url(#arrow)u0022/u003en u003cline x1=u0022646u0022 y1=u0022290u0022 x2=u0022664u0022 y2=u0022290u0022 stroke=u0022#111u0022 stroke-width=u00222u0022/u003en u003cline x1=u0022646u0022 y1=u002290u0022 x2=u0022664u0022 y2=u002290u0022 stroke=u0022#111u0022 stroke-width=u00222u0022/u003en u003ctext x=u0022682u0022 y=u0022190u0022 text-anchor=u0022middleu0022 font-size=u002218u0022 font-weight=u0022800u0022 fill=u0022#111u0022 transform=u0022rotate(-90 682 190)u0022u003e${oppTxt}u003c/textu003en u003ctext x=u0022708u0022 y=u0022190u0022 text-anchor=u0022middleu0022 font-size=u002214u0022 fill=u0022#444u0022 transform=u0022rotate(-90 708 190)u0022u003eMotstående (løft)u003c/textu003enn u003c!u002du002d hypotenus label u002du002du003en u003ctext x=u0022360u0022 y=u0022165u0022 text-anchor=u0022middleu0022 font-size=u002218u0022 font-weight=u0022900u0022 fill=u0022#111u0022 transform=u0022rotate(-22 360 165)u0022u003e${hypTxt}u003c/textu003en u003ctext x=u0022345u0022 y=u0022190u0022 text-anchor=u0022middleu0022 font-size=u002213u0022 fill=u0022#444u0022 transform=u0022rotate(-22 345 190)u0022u003eTakflate (hypotenus)u003c/textu003enn u003c!u002du002d vinkelbue ved A u002du002du003en u003cpath d=u0022M 155 290 A 90 90 0 0 1 208 238u0022 fill=u0022noneu0022 stroke=u0022#111u0022 stroke-width=u00224u0022/u003en u003ctext x=u0022210u0022 y=u0022275u0022 font-size=u002218u0022 font-weight=u0022900u0022 fill=u0022#111u0022u003ev = ${degTxt}u003c/textu003enn u003c!u002du002d formler u002du002du003en u003ctext x=u002240u0022 y=u002255u0022 font-size=u002216u0022 fill=u0022#333u0022u003etan(v) = motstående / nærståendeu003c/textu003en u003ctext x=u002240u0022 y=u002278u0022 font-size=u002215u0022 fill=u0022#555u0022u003ehypotenus = √(motstående² + nærstående²)u003c/textu003enu003c/svgu003e`;n }nn function buildBilagHTML(data){n const now = new Date();n const bilagsnr = (els.bilag.bilagsnr.value.trim() || autoBilagsnr());nn const kunde = esc(els.bilag.kunde.value);n const prosjekt = esc(els.bilag.prosjekt.value);n const ref = esc(els.bilag.ref.value);nn // logo blokkn const logoBlock = LOGO_URLn ? `u003cimg src=u0022${LOGO_URL}u0022 alt=u0022vvsmester.nou0022 style=u0022max-height:46px;display:blocku0022/u003e`n : `u003cdiv style=u0022font-size:12px;color:#666u0022u003eLogo (valgfritt)u003c/divu003e`;nn const svg = buildBilagSVG(data);nn return `nu003c!doctype htmlu003eu003chtml lang=u0022nbu0022u003eu003cheadu003enu003cmeta charset=u0022utf-8u0022/u003eu003cmeta name=u0022viewportu0022 content=u0022width=device-width, initial-scale=1u0022/u003enu003ctitleu003eBilag – Takvinkelu003c/titleu003enu003cstyleu003en body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;margin:26px;color:#111}n .wrap{max-width:900px;margin:0 auto}n .top{display:flex;justify-content:space-between;gap:16px;align-items:flex-start}n h1{font-size:20px;margin:0}n .muted{color:#666;font-size:12px;margin-top:6px;line-height:1.4}n .box{border:1px solid #ddd;border-radius:14px;padding:14px;margin-top:14px}n .grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}n @media (max-width:720px){.grid{grid-template-columns:1fr}}n .k{font-size:12px;color:#666}n .v{font-size:14px;font-weight:800;margin-top:2px}n table{width:100%;border-collapse:collapse;margin-top:10px}n td{padding:10px;border-top:1px solid #eee;vertical-align:top}n td:last-child{text-align:right;font-weight:800}n .small{font-size:12px;color:#666}n .hr{height:1px;background:#eee;margin:14px 0}n .ill{display:flex;justify-content:center;margin:14px 0}n @media print{n body{margin:0}n .wrap{max-width:none}n }nu003c/styleu003enu003c/headu003eu003cbodyu003enu003cdiv class=u0022wrapu0022u003en u003cdiv class=u0022topu0022u003en u003cdivu003e${logoBlock}u003c/divu003en u003cdiv style=u0022text-align:rightu0022u003en u003ch1u003eBilag: Takvinkelu003c/h1u003en u003cdiv class=u0022mutedu0022u003eBilagsnr: u003cbu003e${bilagsnr}u003c/bu003eu003cbr/u003eDato: ${now.toLocaleString(u0022nb-NOu0022)}u003c/divu003en u003c/divu003en u003c/divu003enn u003cdiv class=u0022boxu0022u003en u003cdiv class=u0022gridu0022u003en u003cdivu003eu003cdiv class=u0022ku0022u003eKunde / mottakeru003c/divu003eu003cdiv class=u0022vu0022u003e${kunde || u0022—u0022}u003c/divu003eu003c/divu003en u003cdivu003eu003cdiv class=u0022ku0022u003eProsjekt / adresseu003c/divu003eu003cdiv class=u0022vu0022u003e${prosjekt || u0022—u0022}u003c/divu003eu003c/divu003en u003cdiv style=u0022grid-column:1/-1u0022u003eu003cdiv class=u0022ku0022u003eReferanse / meldingu003c/divu003eu003cdiv class=u0022vu0022u003e${ref || u0022—u0022}u003c/divu003eu003c/divu003en u003c/divu003enn u003cdiv class=u0022hru0022u003eu003c/divu003enn u003cdiv class=u0022illu0022u003en ${svg}n u003c/divu003enn u003cdiv class=u0022hru0022u003eu003c/divu003enn u003ctableu003en u003ctru003eu003ctdu003eMotståendeu003c/tdu003eu003ctdu003e${fmt(data.opp,u0022mu0022,3)}u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eNærståendeu003c/tdu003eu003ctdu003e${fmt(data.adj,u0022mu0022,3)}u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eHypotenus / takflateu003c/tdu003eu003ctdu003e${fmt(data.hyp,u0022mu0022,3)}u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eTakvinkelu003c/tdu003eu003ctdu003e${fmt(data.deg,u0022°u0022,2)}u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eTakfall (%)u003c/tdu003eu003ctdu003e${fmt(data.pct,u0022%u0022,1)}u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eTakfall (1:x)u003c/tdu003eu003ctdu003e${(data.tanv===0) ? u00220u0022 : (u00221:u0022 + data.ratioX.toLocaleString(u0022nb-NOu0022,{maximumFractionDigits:2}))}u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003ecm per meteru003c/tdu003eu003ctdu003e${fmt(data.cmPerM,u0022cm/mu0022,1)}u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eFormleru003c/tdu003eu003ctd class=u0022smallu0022 style=u0022text-align:right;font-weight:600u0022u003etan(v)=mot/nær, hyp=√(mot²+nær²)u003c/tdu003eu003c/tru003en u003ctru003eu003ctdu003eMerknadu003c/tdu003eu003ctd class=u0022smallu0022 style=u0022text-align:right;font-weight:600u0022u003eDokumentasjon på beregning (ikke faktura)u003c/tdu003eu003c/tru003en u003c/tableu003en u003c/divu003enu003c/divu003enu003c/bodyu003eu003c/htmlu003e`;n }nn $(u0022#calcBtnu0022).addEventListener(u0022clicku0022, calc);n $(u0022#resetBtnu0022).addEventListener(u0022clicku0022, reset);nn [u0022opp_inu0022,u0022opp_unitu0022,u0022adj_inu0022,u0022adj_unitu0022].forEach(id=u003e{n const el=$(u0022#u0022+id); if(el) el.addEventListener(u0022inputu0022, calc);n });nn $(u0022#copyBtnu0022).addEventListener(u0022clicku0022, async ()=u003e{n const data = calc();n await copyResult(data);n });nn $(u0022#printBtnu0022).addEventListener(u0022clicku0022, ()=u003e{n const data = calc();n if(!data){ alert(u0022Fyll inn mål først.u0022); return; }n const html = buildBilagHTML(data);n printHtmlViaIframe(html);n });nn calc();n })();n u003c/scriptu003enu003c/divu003e
u003ch2u003eTakvinkel-kalkulator: beregn grader, takfall og takflate (hypotenus)u003c/h2u003ennu003cpu003enNår du skal planlegge taktekking, renner, beslag, bæring eller oppmåling på en bolig, er det nyttig å vitenu003cstrongu003etakvinkelenu003c/strongu003e i grader. Takvinkel kan også uttrykkes som u003cstrongu003etakfallu003c/strongu003e (prosent),nsom forholdet u003cstrongu003e1:xu003c/strongu003e, eller som u003cstrongu003ecm per meteru003c/strongu003e. Med takvinkel-kalkulatoren overnkan du regne ut alt dette ved å legge inn to enkle mål: u003cstrongu003emotståendeu003c/strongu003e og u003cstrongu003enærståendeu003c/strongu003e.nu003c/pu003ennu003ch3u003eMotstående og nærstående – hva betyr det?u003c/h3u003enu003cpu003enTenk på taket som en u003cstrongu003erettvinklet trekantu003c/strongu003e:nu003c/pu003enu003culu003en u003cliu003eu003cstrongu003eMotstående katetu003c/strongu003e = høydeforskjellen (løftet opp)u003c/liu003en u003cliu003eu003cstrongu003eNærstående katetu003c/strongu003e = horisontal lengde (løpet bort)u003c/liu003enu003c/ulu003enu003cpu003enHvis du måler hvor mye taket stiger opp (motstående) over en kjent horisontal lengde (nærstående),nkan du finne vinkelen ved å bruke tangens.nu003c/pu003ennu003ch3u003eFormelen: tan(v) = motstående / nærståendeu003c/h3u003enu003cpu003enSammenhengen er:nu003c/pu003enu003cpu003eu003cstrongu003etan(v) = motstående / nærståendeu003c/strongu003eu003c/pu003enu003cpu003enKalkulatoren bruker deretter den inverse funksjonen (u003cemu003earctanu003c/emu003e) for å finne vinkelen i grader:nu003c/pu003enu003cpu003eu003cstrongu003ev = arctan(motstående / nærstående)u003c/strongu003eu003c/pu003ennu003ch3u003eTakfall i prosent (%)u003c/h3u003enu003cpu003enTakfall i prosent er i praksis bare forholdet mellom høyde og lengde, ganget med 100:nu003c/pu003enu003cpu003eu003cstrongu003eTakfall (%) = (motstående / nærstående) · 100u003c/strongu003eu003c/pu003enu003cpu003enEksempel: Hvis taket stiger 0,40 m over en horisontal lengde på 4,00 m, blir forholdet 0,40/4,00 = 0,10.nDa er takfallet u003cstrongu003e10%u003c/strongu003e.nu003c/pu003ennu003ch3u003ecm per meter – en praktisk måte å forstå fall påu003c/h3u003enu003cpu003enMange synes det er enklere å tenke i cm per meter. Det sier hvor mange cm taket stiger per 1 meter horisontalt:nu003c/pu003enu003cpu003eu003cstrongu003ecm per meter = (motstående / nærstående) · 100u003c/strongu003eu003c/pu003enu003cpu003enI eksempelet over (0,10) blir det u003cstrongu003e10 cm per meteru003c/strongu003e. Det henger sammen med prosent: 10% = 10 cm/m.nu003c/pu003ennu003ch3u003eTakfall som 1:xu003c/h3u003enu003cpu003enNoen beskriver takfall som 1:x. Det betyr “1 enhet opp per x enheter bort”.nKalkulatoren regner dette som:nu003c/pu003enu003cpu003eu003cstrongu003e1:x = 1 / (motstående / nærstående)u003c/strongu003eu003c/pu003enu003cpu003enHvis forholdet er 0,10 blir det 1 / 0,10 = 10, altså u003cstrongu003e1:10u003c/strongu003e.nu003c/pu003ennu003ch3u003eTakflate (hypotenus) – lengden langs taketu003c/h3u003enu003cpu003enI tillegg til vinkel og fall er det ofte nyttig å vite u003cstrongu003etakflatelengdenu003c/strongu003e (den skrå lengden).nDen er hypotenusen i trekanten og beregnes med Pythagoras:nu003c/pu003enu003cpu003eu003cstrongu003eHypotenus = √(motstående² + nærstående²)u003c/strongu003eu003c/pu003enu003cpu003enDette kan være relevant når du skal beregne lengder på materialer, dimensjonere beslag, eller kontrollmåle oppmåling.nu003c/pu003ennu003ch3u003eSlik bruker du kalkulatorenu003c/h3u003enu003colu003en u003cliu003eLegg inn u003cstrongu003emotståendeu003c/strongu003e (høydeforskjell) og velg enhet (m, cm eller mm).u003c/liu003en u003cliu003eLegg inn u003cstrongu003enærståendeu003c/strongu003e (horisontal lengde) og velg enhet.u003c/liu003en u003cliu003eLes av u003cstrongu003etakvinkel (grader)u003c/strongu003e, u003cstrongu003etakfall (%)u003c/strongu003e, u003cstrongu003e1:xu003c/strongu003e, u003cstrongu003ecm per meteru003c/strongu003e og u003cstrongu003ehypotenusu003c/strongu003e.u003c/liu003en u003cliu003eTrykk u003cstrongu003eUtskrift / PDF (bilag)u003c/strongu003e for å få dokumentasjon med illustrasjon og mål.u003c/liu003enu003c/olu003ennu003cpu003enTips: Når du måler i praksis, er det lurt å velge et målepunkt med tydelig horisontal lengde (f.eks. 1, 2 eller 4 meter),nslik at du får stabile målinger. Kalkulatoren tåler at du legger inn cm eller mm, og konverterer automatisk.nu003c/pu003ennu003cpu003enMed takvinkel-kalkulatoren får du en rask, ryddig og dokumenterbar beregning — perfekt både til planlegging,nkontroll og kommunikasjon med andre på prosjektet.nu003c/pu003e
u003ch2u003eRelaterte kalkulatoreru003c/h2u003enu003culu003en u003cliu003eu003ca href=u0022/malestokk-kalkulator/u0022u003eMålestokk-kalkulatoru003c/au003eu003c/liu003en u003cliu003eu003ca href=u0022/trappekalkulator/u0022u003eTrappekalkulatoru003c/au003eu003c/liu003en u003cliu003eu003ca href=u0022/ohms-lov-kalkulator/u0022u003eOhms lov-kalkulatoru003c/au003eu003c/liu003en u003cliu003eu003ca href=u0022/effekt-kalkulator/u0022u003eEffekt-kalkulator (W, V, A, Ω)u003c/au003eu003c/liu003en u003cliu003eu003ca href=u0022/stromutgifter-kalkulator/u0022u003eStrømutgifter (kWh → kroner)u003c/au003eu003c/liu003enu003c/ulu003e