Создание "куска пирога" в OpenSCAD?

Когда я делаю цилиндр, иногда мне нужно взять только кусочек пирога. В настоящее время я использую этот изящный трюк, чтобы сделать ломтики пирога под углом менее 90 градусов. Тем не менее, мне нужно несколько углов больше 90, но меньше 180 градусов. Есть ли способ обобщить/расширить это, чтобы работать под этими большими углами?

module pie_slice(r=3.0,a=30) {     
   intersection() {
    circle(r=r);
    square(r);
    rotate(a-90) square(r);  
  } 
}

pie_slice(r=10,a=15);

, 👍6

Обсуждение

Я думаю, что проще всего было бы использовать " разницу`. Окружность минус два куба со сторонами 2*R. (Или один из размера 2*R и один из размера R.), @Tomas By

IIUC, это похоже на мой текущий обходной путь (я опубликовал ниже для справки). Я использую "объединение` вместо "пересечение". К сожалению, вам придется изучить, сколько степеней хочет вызывающий абонент, и использовать ту или иную - мне еще предстоит найти универсальный метод, @Hamy

Подумайте об этом так: у вас есть два прямоугольника, которые покрывают каждую половину круга. Затем вы открываете зазор между ними под углом. Это должно работать для любого угла между 0 и 180., @Tomas By

О, щелчок, это звучит идеально. Я попробую, спасибо, @Hamy

Или используйте модуль, который может создавать кусочки пирога, например [Фаски для OpenSCAD](https://github.com/SebiTimeWaster/Chamfers-for-OpenSCAD)., @0scar


3 ответа


1

Мой текущий обходной путь-использовать объединение вместо пересечения. К сожалению, это означает, что я должен использовать предложение if, которое заставляет код иметь два пути вместо одного чистого подхода. Кроме того, в отличие от описанного выше метода, это не приводит к чистой цилиндрической форме, а вместо этого должно быть объединено с соответствующим цилиндром, чтобы получить окончательный кусок пирога

   size = length + 2;
    if (angle_deg <= 90) {
      translate([0,0,-1]) 
      intersection() {
        cube(size);
        rotate(angle_deg-90) cube(size);
      }
    } else if (angle_deg <= 180) {
      translate([0,0,-1]) 
      union() {
        cube(size);
        rotate(angle_deg-90) cube(size);
      }      
    } else {
      echo(str("FAILURE - Angle cannot exceed 180"));
    } 



,

1

Хотя создание сложных фигур путем объединения примитивных фигур OpenSCAD является устоявшейся традицией и часто является всем, что требуется, в этом случае было бы более элегантным создать срез круга непосредственно с помощью функции многоугольника и понимания списка.

module pie_slice(r=3.0, a=30) {
  polygon(points=[
    [0, 0],
    for(theta=0; theta<a; theta=theta+$fa)
      [r*cos(theta), r*sin(theta)],
    [r*cos(a), r*sin(a)]
  ]);
}

Обратите внимание, что приведенный выше код немного грубоват, так как он не проверяет ошибки, но он работает. Он использует специальную переменную $fa для угла шага.

,

3

Вот что я использую:

module pieSlice(a, r, h){
  // a:angle, r:radius, h:height
  rotate_extrude(angle=a) square([r,h]);
}
pieSlice(110,20,3);
,