我正在尝试在名为Grasshopper(Rhino3D的一部分)的包中使用C#.net优化一些数学运算.操作非常简单,但必须执行的列表很大,可能会变得更大.
我在我的C#脚本中使用Parallel.ForEach和列表,我得到的最终结果数低于预期.这很可能是因为list.add不是线程安全的(或者我正在构建它的软件中没有线程安全).
private void RunScript(double z, int x, List<double> y, ref object A)
{
List<double> temp = new List<double>();
double r;
System.Threading.Tasks.Parallel.ForEach(y, numb =>
{
r = Math.Pow((numb * x), z);
temp.Add(r);
});
A = temp;
Run Code Online (Sandbox Code Playgroud)
请帮我找出一种使用CPU多线程在数百个值上运行这个简单数学运算的简单有效的方法(或者如果你有关于GPU CUDA的建议).
我希望这个模糊不清的软件不会打扰你,因为据我所知,它的表现与普通的C#.Net/Python/VB.Net完全相同.
我正在尝试创建一种动态方式来在 Three.js 中的 gltf 导入模型上显示太阳能数据。目的是将不同的纯色与模型的不同部分相关联,并能够关闭和打开这些部分。我目前的障碍是更改 gltf 中材料的颜色。
我曾尝试使用 ObjLoader 来代替我输入自己的材料,但这不起作用:/
这是我目前拥有的js:
const gltfLoader = new THREE.GLTFLoader();
gltfLoader.load('Building.glb', (gltf) => {
const root = gltf.scene;
scene.add(root);
const box = new THREE.Box3().setFromObject(root);
const boxSize = box.getSize(new THREE.Vector3()).length();
const boxCenter = box.getCenter(new THREE.Vector3());
frameArea(boxSize * 0.5, boxSize, boxCenter, camera);
controls.maxDistance = boxSize * 10;
controls.target.copy(boxCenter);
controls.update();
});
function frameArea(sizeToFitOnScreen, boxSize, boxCenter, camera) {
const halfSizeToFitOnScreen = sizeToFitOnScreen * 0.5;
const halfFovY = THREE.Math.degToRad(camera.fov * .5);
const distance = halfSizeToFitOnScreen / Math.tan(halfFovY);
const direction …Run Code Online (Sandbox Code Playgroud) 我试图获得曲线的长度,但我收到的消息:MissingMemberException: 'Guid' object has no attribute 'length'C#中的相同脚本完美无缺.python翻译有什么问题?这是文档.
蟒蛇:
import rhinoscriptsyntax as rs
ln = rs.AddLine(pt1, pt2)
a = ln
b = ln.Length
Run Code Online (Sandbox Code Playgroud)
C#:
Line ln;
ln = new Line(pt1, pt2);
A = ln;
B = ln.Length;
Run Code Online (Sandbox Code Playgroud) 我编写了一个 C# 渲染方法,将热图渲染到 Grasshopper 画布上。Grasshopper 是一个 Rhino 插件,支持简单的 GUI 编程界面。
protected override void Render(Grasshopper.GUI.Canvas.GH_Canvas canvas, Graphics graphics, Grasshopper.GUI.Canvas.GH_CanvasChannel channel) {
base.Render(canvas, graphics, channel);
if (channel == Grasshopper.GUI.Canvas.GH_CanvasChannel.Wires) {
var comp = Owner as KT_HeatmapComponent;
if (comp == null)
return;
List<HeatMap> maps = comp.CachedHeatmaps;
if (maps == null)
return;
if (maps.Count == 0)
return;
int x = Convert.ToInt32(Bounds.X + Bounds.Width / 2);
int y = Convert.ToInt32(Bounds.Bottom + 10);
for (int i = 0; i < maps.Count; i++) {
Bitmap image = …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我收到错误
属性,索引器或动态成员访问可能不会作为out或ref参数传递?
在m_settings.Length编译它时的参数.我该怎么解决这个问题?
public override bool Read(GH_IO.Serialization.GH_IReader reader)
{
if (m_settings != null && m_settings.Length > 0)
{
reader.TryGetInt32("StringCount", ref m_settings.Length);
for (int i = 0; i < m_settings.Length; i++)
{
reader.TryGetString("String", i, ref m_settings[i]);
}
}
return base.Read(reader);
}
Run Code Online (Sandbox Code Playgroud) 
你好,
我第一次尝试在 Grasshopper 中使用 C# 进行多线程处理。该函数是一个简单的两点距离函数,有两个 10,000 个点的输入。该代码可以工作,但比单线程组件花费的时间要长得多。我很好奇是否有人可以解释这是为什么。
using System;
using System.Collections;
using System.Collections.Generic;
using Rhino;
using Rhino.Geometry;
using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent;
private void RunScript(List<Point3d> x, List<Point3d> y, ref object A)
{
var results = new ConcurrentDictionary<Point3d, double>(Environment.ProcessorCount, x.Count);
List<double> output = new List<double>();
foreach(Point3d pt in x) results[pt] = 0;
Parallel.ForEach(x, pt =>
{
results[pt] = pt.DistanceTo(y[x.IndexOf(pt)]);
});
foreach(Point3d pt in x)
{
output.Add(results[pt]);
}
A = output;
Run Code Online (Sandbox Code Playgroud)
我知道使用并发字典、两个循环和列表肯定会产生沉重的开销,但我假设点的数量越高,您就越会看到相对于单个线程的好处,但事实并非如此。如果我使用的是一种非常低效的方法,我想知道,或者对于这样一个简单的任务,开销几乎不可能证明多线程是合理的?
我正在Rhino Grasshopper中编写一个C#组件.我想确定List是否constraints包含List 中的Point3d对象nodes.如果是这样,则返回列表中b与条目对应的条目nodes应该是true,否则false.要确定对象是否相同,请使用比较容差tol.
作为一个例子,让nodes = {A, B, C, D, E, F}和constraints = {a, f}是三维点对象的列表.因为之间的距离A和a与,F和f等于或小于tol:
A.DistanceTo(a) <= tol // True
Run Code Online (Sandbox Code Playgroud)
我们将得到b = {true, false, false, false, true}回报.
我想我可以找到b以某种方式使用LINQ.
grasshopper ×7
c# ×6
rhino3d ×2
bitmap ×1
canvas ×1
gltf ×1
indexer ×1
ironpython ×1
linq ×1
member ×1
properties ×1
python ×1
rhino ×1
three.js ×1